Скажімо, у мене є клас з деякими членами, а члени мають менш обмежуючий модифікатор доступу, ніж сам клас.
Конкретним прикладом може бути:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
Наскільки я розумію, модифікатор доступу до класу, який є більш обмежуючим, ніж модифікатор доступу для членів , буде замінювати менш обмежуючі модифікатори доступу для членів . Отже, менш обмежувальний модифікатор доступу членів взагалі не повинен мати ефекту.
- Чи правильно моє розуміння?
- Якщо ні, то які наслідки?
- Які можуть бути поважні причини мати менш обмежувальні модифікатори доступу членів?
- Нарешті, яких найкращих практик слід дотримуватися?
Я також робив деякі експерименти, тому що я думав, що це може мати наслідки, коли я починаю передавати посилання на функції, але навіть тоді модифікатор доступу не має значення.
Ситуація, яку я сконструював, така:
apples.B
надає загальнодоступний метод, наbla()
який повертається посилання наapples.A.foo
.- Потім
pizzas.C
дзвонить,apples.B.bla
щоб отримати посилання на нього,A.foo
і викликає його. - Таким чином,
A.foo()
це не безпосередньо видноC
, а доступне лише опосередковано черезB.bla()
Я перевірив це, і це не має ніякого значення, роблю я модифікатор доступу foo()
пакета приватним чи ні.
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
вjava.util.Collections
).