Supponiamo che io abbia una classe con alcuni membri e che i membri abbiano un modificatore di accesso meno restrittivo della classe stessa.
Un esempio concreto potrebbe essere:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
Per quanto ne so, un modificatore di accesso di classe che è più restrittivo del modificatore di accesso dei membri , sostituirà i modificatori di accesso dei membri meno restrittivi . Quindi un modificatore di accesso membro meno restrittivo non dovrebbe avere alcun effetto.
- La mia comprensione è corretta?
- In caso contrario, quali sono le conseguenze?
- Quali potrebbero essere i motivi validi per avere modificatori di accesso dei membri meno restrittivi?
- Infine, quali sono le migliori pratiche da seguire?
Ho anche fatto alcuni esperimenti perché pensavo che potesse avere conseguenze una volta che avessi iniziato a passare i riferimenti alle funzioni, tuttavia anche allora il modificatore di accesso non sembra importare.
La situazione che ho costruito è la seguente:
apples.B
fornisce un metodo pubblicobla()
che restituisce un riferimento aapples.A.foo
.- Quindi
pizzas.C
chiamaapples.B.bla
per ottenere un riferimentoA.foo
e lo chiama. - Quindi
A.foo()
non è direttamente visibileC
, ma è accessibile solo indirettamente tramiteB.bla()
L'ho provato e non fa differenza se rendo foo()
privato o meno il modificatore di accesso del pacchetto .
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>
èprivate
injava.util.Collections
).