Angenommen, ich habe eine Klasse mit einigen Mitgliedern, und die Mitglieder haben einen weniger restriktiven Zugriffsmodifikator als die Klasse selbst.
Ein konkretes Beispiel könnte sein:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
Zu meinem Verständnis einer Klasse Zugriffsmodifikator , die restriktiver als das ist Mitglied Zugriffsmodifikator , wird außer Kraft setzen , die weniger restriktive Mitglied Zugriffsmodifikatoren . Ein weniger restriktiver Modifikator für den Mitgliederzugriff sollte daher überhaupt keine Auswirkung haben.
- Ist mein Verständnis richtig?
- Wenn nicht, was sind die Konsequenzen?
- Was könnten triftige Gründe für weniger restriktive Mitgliederzugriffsmodifikatoren sein?
- Was gibt es schließlich als bewährte Methode?
Ich habe auch experimentiert, weil ich dachte, dass dies Konsequenzen haben könnte, wenn ich anfange, Funktionsreferenzen weiterzugeben, aber selbst dann scheint der Zugriffsmodifikator keine Rolle zu spielen.
Die Situation, die ich konstruiert habe, ist die folgende:
apples.B
stellt eine öffentliche Methode bereitbla()
, die einen Verweis auf zurückgibtapples.A.foo
.- Dann
pizzas.C
ruftapples.B.bla
einen Verweis auf erhalten ,A.foo
und es nennt. - Ist
A.foo()
also nicht direkt sichtbarC
, sondern nur indirekt über erreichbarB.bla()
Ich habe es getestet und es macht keinen Unterschied, ob ich den Zugriffsmodifikator des foo()
Pakets privat mache oder nicht.
package apples;
import java.util.function.IntSupplier;
public class B {
public IntSupplier getReferenceToAFoo() {
A aInstance = new A();
return aInstance::foo;
}
}
package pizzas;
import apples.B;
import java.util.function.IntSupplier;
public class C {
private int callAFooIndirectly() {
B bInstance = new B();
IntSupplier intsupplier = bInstance.getReferenceToAFoo();
return intsupplier.getAsInt();
}
public static void main(String[] args) {
C cInstance = new C();
int i = cInstance.callAFooIndirectly();
System.out.println(i);
assert 42 == i;
}
}
quelle
java.util.Collections.SingletonSet<E>
istprivate
injava.util.Collections
).Antworten:
Ja.
Zwei Gründe:
public
public
, auch in einer paketprivaten Klasse, müssen Sie später nur noch zur Klassendeklaration hinzufügenpublic
, um die Klasse öffentlich zu machen .Das ist Ansichtssache und daher für eine Frage oder Antwort zum Stapelüberlauf nicht gut geeignet. Tun Sie, was Ihnen und / oder Ihrem Team vernünftig erscheint, und / oder tun Sie, was Ihnen der Styleguide Ihres Teams vorschreibt.
quelle