Ben*_*ers 284 java coding-style interface public-method
是否应使用或不使用public访问修饰符声明Java接口中的方法?
当然,技术上没关系.实现a的类方法interface总是如此public.但什么是更好的惯例?
Java本身并不一致.例如,参见Collectionvs. Comparable或Futurevs ScriptEngine..
Jon*_*eet 327
该JLS了这一点:
允许但不鼓励作为样式,冗余地指定接口中声明的方法的
public和/或abstract修饰符.
Ras*_*ber 41
Java接口中应省略public修饰符(在我看来).
由于它没有添加任何额外的信息,它只会引起人们对重要事物的注意.
大多数样式指南都会建议您将其遗漏,但当然,最重要的是在整个代码库中保持一致,特别是对于每个界面.下面的例子很容易让一些不熟悉Java的人感到困惑:
public interface Foo{
public void MakeFoo();
void PerformBar();
}
Run Code Online (Sandbox Code Playgroud)
尽管很久以前就已经提出了这个问题,但我觉得全面的描述会澄清为什么在接口常量之前不需要在方法和公共静态最终之前使用公共抽象.
首先,接口用于为一组不相关的类指定通用方法,每个类都有一个独特的实现.因此,无法将访问修饰符指定为私有,因为其他类无法访问它以进行覆盖.
其次,虽然可以启动接口类型的对象,但接口是由实现它的类实现的,而不是继承的.并且由于接口可能由不在同一包中的不相关类实现(实现),因此受保护的访问修饰符也是无效的.所以对于访问修饰符,我们只剩下公共选择.
第三,接口没有任何数据实现,包括实例变量和方法.如果逻辑上有理由在接口中插入已实现的方法或实例变量,那么它必须是继承层次结构中的超类而不是接口.考虑到这一事实,由于无法在接口中实现任何方法,因此接口中的所有方法都必须是抽象的.
第四,接口只能包含常量作为其数据成员,这意味着它们必须是最终的,当然最终常量被声明为静态以仅保留它们的一个实例.因此,静态final也是接口常量必须的.
因此总的来说,虽然在方法和公共静态最终在接口的常量之前使用公共抽象是有效的但是因为没有其他选项,所以它被认为是冗余的而不是使用的.
小智 6
随着引进的private,static,default在Java 8/9接口方法改性剂,事情变得更加复杂,我倾向于认为完全声明是更具可读性(需要Java 9编译):
public interface MyInterface {
//minimal
int CONST00 = 0;
void method00();
static void method01() {}
default void method02() {}
private static void method03() {}
private void method04() {}
//full
public static final int CONST10 = 0;
public abstract void method10();
public static void method11() {}
public default void method12() {}
private static void method13() {}
private void method14() {}
}
Run Code Online (Sandbox Code Playgroud)
我总是写如果没有接口并且我正在编写直接实现,即我将使用public.
我使用了public修饰符的declare方法,因为它使代码更具可读性,尤其是语法高亮.在我们的最新项目中,我们使用了Checkstyle,它显示了一个警告,其中包含public接口方法的修饰符的默认配置,所以我切换到省略它们.
所以我不确定什么是最好的,但有一点我真的不喜欢使用public abstract接口方法.Eclipse在使用"Extract Interface"进行重构时有时会这样做.
我不同意流行的答案,即公开意味着还有其他选择,因此不应该存在。事实是,现在 Java 9 及以后还有其他选择。
我认为 Java 应该强制/要求指定“公共”。为什么?因为缺少修饰符意味着在其他任何地方都可以“包”访问,并且将其作为特例会导致混淆。如果您只是简单地使用明确的消息(例如“接口中不允许包访问。”)将其设置为编译错误,我们将消除选择忽略“public”所带来的明显歧义。
请注意当前的措辞:https : //docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4
“接口主体中的方法可以声明为public或 private(第 6.6 节)。如果没有给出访问修饰符,则该方法是隐式公开的。允许但不鼓励在风格上冗余指定公共接口中方法声明的修饰符。”
看到现在允许“私人”。我认为最后一句话应该从 JLS 中删除。不幸的是,“隐式公开”行为曾经被允许,因为它现在可能会保留为向后兼容,并导致混淆,即没有访问修饰符意味着接口中的“公共”和其他地方的“包”。
| 归档时间: |
|
| 查看次数: |
104307 次 |
| 最近记录: |