Disons que j'ai une classe avec certains membres et que les membres ont un modificateur d'accès moins restrictif que la classe elle-même.
Un exemple concret pourrait être:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
À ma connaissance, un modificateur d'accès aux classes plus restrictif que le modificateur d'accès aux membres remplacera les modificateurs d'accès aux membres les moins restrictifs . Un modificateur d'accès aux membres moins restrictif ne devrait donc avoir aucun effet.
- Ma compréhension est-elle correcte?
- Sinon, quelles en sont les conséquences?
- Quelles pourraient être des raisons valables d'avoir des modificateurs d'accès aux membres moins restrictifs?
- Enfin, quelles sont les meilleures pratiques à suivre?
J'ai également fait des expériences parce que je pensais que cela pourrait avoir des conséquences une fois que je commencerais à transmettre des références de fonction, mais même dans ce cas, le modificateur d'accès ne semble pas avoir d'importance.
La situation que j'ai construite est la suivante:
apples.Bfournit une méthode publiquebla()qui renvoie une référence àapples.A.foo.- Ensuite , les
pizzas.Cappelsapples.B.blapour obtenir une référence àA.fooet appelle. - Il
A.foo()n'est donc pas directement visibleC, mais n'est accessible qu'indirectement viaB.bla()
Je l'ai testé et cela ne fait aucune différence que je rende foo() privé ou non le modificateur d'accès du package .
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;
}
}
java.util.Collections.SingletonSet<E>estprivatededansjava.util.Collections).