たとえば、いくつかのメンバーを持つクラスがあり、メンバーにはクラス自体よりも制限の少ないアクセス修飾子があるとします。
具体的な例は次のとおりです。
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
)。