最近,我正在编写一个类,我决定将其作为包私有(即没有访问修饰符或默认修饰符).它有一个内部类和一些private辅助方法,以及一个旨在由同一个包中的类使用的方法.所有这些班级成员都是static.但后来我有一个想法:这个方法应该有public访问修饰符还是没有访问修饰符,比如包含它的类?
一方面,由于类本身是包私有的,因此只能在其包中访问和使用它,因此没有实际的理由来制作该方法public.但同时,在语义上,此方法旨在成为类的公共特性,即,旨在外部使用的类的特性,因此修改其访问权限是有意义的.
对于那些喜欢看代码的人,
final class DummyRemover {
private DummyRemover() {
}
public static int remove(Map<String, ClassNode> classMap) {
return 0;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
要么,
final class DummyRemover {
private DummyRemover() {
}
// Notice the modifier.
static int remove(Map<String, ClassNode> classMap) {
return 0;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
这里最好的选择是什么?是否有一个经验法则来决定在这种情况下使用哪些访问修饰符?
为什么方法应该具有比其封闭类更高的可见性有两个原因:
...用于子类扩展,最终可能是公共的,并且手头的方法应该是公开的.例如
abstract class Base {
public void x() {}
}
public class Sub extends Base {
}
// Now, everyone can call:
new Sub().x();
Run Code Online (Sandbox Code Playgroud)
但是,通常,如果这是您的意图,您x()仍然会在界面中声明您的方法.即使您没有x()在设计方面声明接口,最好将基本方法保持在与其类相同的可见性级别,并在子类中"打开"该方法,因为这将更清楚地传达意图:
abstract class Base {
void x() {}
}
public class Sub extends Base {
/** public Javadoc here */
@Override
public void x() {
super.x();
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到为什么这种方法应该像你的情况那样应用于静态方法的原因.
...因为它从接口实现了一个方法.遗憾的是,Java不提供包私有或私有接口方法.所以下面是通常的,即使没有任何子类,即使接口本身可能是包私有(甚至嵌套私有):
final class Y implements X {
@Override
public void x() {}
}
Run Code Online (Sandbox Code Playgroud)
这(不幸的是)也适用于接口上的静态类,它们只能是公共的:
interface I {
/* implicitly public */ static void x() {}
}
Run Code Online (Sandbox Code Playgroud)
对此有两种观点:
一组人更喜欢添加不必要的修饰符(例如public,在本例中,private在私有类中)作为“代码文档”的形式。例如,这是 Eric Lippert 在他对这个相关 C# 问题的回答中所支持的观点。
另一组更喜欢永远不要添加没有功能效果的源代码:如果public不执行任何操作,那么它不属于您的源代码。
我想我现在坚定地站在第二个阵营,但我理解第一个阵营的论点,而且我认为它并不像乍看起来那样一成不变。理性的人可能会不同意,这就是为什么(如大括号和空格)这是您应该在项目风格指南中决定一次,然后不再争论的原因。:-)
| 归档时间: |
|
| 查看次数: |
1036 次 |
| 最近记录: |