假设我有一个包含一些成员的类,并且这些成员的限制访问修饰符比类本身少。
一个具体的例子可能是:
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
)。