使用比 class 访问修饰符限制更少的成员访问修饰符有什么用?
Whats the use of less restrictive member access modifiers than the class access modifier?
假设我有一个 class 和一些成员,并且这些成员的访问修饰符比 class 本身限制更少。
一个具体的例子可以是:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
据我了解,class 访问修饰符 比 [=36 更严格=]member 访问修饰符,将覆盖限制较少的 member 访问修饰符。因此,限制较少的 member 访问修饰符 应该根本没有效果。
- 我的理解对吗?
- 如果没有,后果是什么?
- 使用限制较少的成员访问修饰符的正当理由是什么?
- 最后,有哪些最佳实践可以遵循?
我也做了一些实验,因为我认为一旦我开始传递函数引用它可能会产生影响,但即便如此,访问修饰符似乎并不重要。
我构建的情况如下:
apples.B
提供了一个 public 方法 bla()
returns 对 apples.A.foo
. 的引用
- 然后
pizzas.C
调用apples.B.bla
获取对A.foo
的引用并调用它。
- 因此
A.foo()
对 C
不直接可见,只能通过 B.bla()
间接访问
我测试了它,是否将 foo()
package 的访问修饰符设置为 private 没有区别。
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;
}
}
Is my understanding correct?
是的。
What could be valid reasons to have less restrictive member access modifiers?
两个原因:
- 有时,您正在实现一个接口;接口方法必须是
public
- 它可以更轻松地更改 class 的整体访问权限。例如,如果你标记所有你想成为 public
public
的方法,即使在包私有 class 中,那么稍后你必须做的就是使class public 是将 public
添加到 class 声明。
Finally, what are there best practice to follow?
这是一个见仁见智的问题,因此不太适合 Stack Overflow 问题或答案。做你认为合理的事 and/or 你的团队,and/or 做你团队的风格指南告诉你做的事。
假设我有一个 class 和一些成员,并且这些成员的访问修饰符比 class 本身限制更少。
一个具体的例子可以是:
package apples;
class A { // package private
public int foo() { // public (=> less restrictive than *package private*)
return 42;
}
}
据我了解,class 访问修饰符 比 [=36 更严格=]member 访问修饰符,将覆盖限制较少的 member 访问修饰符。因此,限制较少的 member 访问修饰符 应该根本没有效果。
- 我的理解对吗?
- 如果没有,后果是什么?
- 使用限制较少的成员访问修饰符的正当理由是什么?
- 最后,有哪些最佳实践可以遵循?
我也做了一些实验,因为我认为一旦我开始传递函数引用它可能会产生影响,但即便如此,访问修饰符似乎并不重要。
我构建的情况如下:
apples.B
提供了一个 public 方法bla()
returns 对apples.A.foo
. 的引用
- 然后
pizzas.C
调用apples.B.bla
获取对A.foo
的引用并调用它。 - 因此
A.foo()
对C
不直接可见,只能通过B.bla()
间接访问
我测试了它,是否将 foo()
package 的访问修饰符设置为 private 没有区别。
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;
}
}
Is my understanding correct?
是的。
What could be valid reasons to have less restrictive member access modifiers?
两个原因:
- 有时,您正在实现一个接口;接口方法必须是
public
- 它可以更轻松地更改 class 的整体访问权限。例如,如果你标记所有你想成为 public
public
的方法,即使在包私有 class 中,那么稍后你必须做的就是使class public 是将public
添加到 class 声明。
Finally, what are there best practice to follow?
这是一个见仁见智的问题,因此不太适合 Stack Overflow 问题或答案。做你认为合理的事 and/or 你的团队,and/or 做你团队的风格指南告诉你做的事。