是否应使用或不使用公共访问修饰符声明Java接口中的方法?

Ben*_*ers 284 java coding-style interface public-method

是否应使用或不使用public访问修饰符声明Java接口中的方法?

当然,技术上没关系.实现a的类方法interface总是如此public.但什么是更好的惯例?

Java本身并不一致.例如,参见Collectionvs. ComparableFuturevs ScriptEngine..

Jon*_*eet 327

JLS了这一点:

允许但不鼓励作为样式,冗余地指定接口中声明的方法的public和/或abstract修饰符.

  • 上面的JLS链接是在我阅读时的Java 7.在关于允许非公开方法的Java 9的评论之后,我只是想确认[SE9 JLS]仍然存在非常相似的措辞(https://docs.oracle.com/javase/specs/jls/se9/html/ JLS-9.html#JLS-9.4).(`public`部分相同,`和/或abstract`部分已被删除) (5认同)
  • 在[SE11 JLS]中仍然适用(https://docs.oracle.com/javase/specs/jls/se11/html/jls-9.html#jls-9.4) (3认同)

Ras*_*ber 41

Java接口中应省略public修饰符(在我看来).

由于它没有添加任何额外的信息,它只会引起人们对重要事物的注意.

大多数样式指南都会建议您将其遗漏,但当然,最重要的是在整个代码库中保持一致,特别是对于每个界面.下面的例子很容易让一些不熟悉Java的人感到困惑:

public interface Foo{
  public void MakeFoo();
  void PerformBar();
}
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,一致性是最重要的,并且是99%的这类问题的答案. (9认同)
  • 你有这种风格指南的链接吗? (3认同)
  • Bno:一个例子是Java语言规范,另一个例子是Checkstyle. (2认同)

Leo*_*our 8

尽管很久以前就已经提出了这个问题,但我觉得全面的描述会澄清为什么在接口常量之前不需要在方法和公共静态最终之前使用公共抽象.

首先,接口用于为一组不相关的类指定通用方法,每个类都有一个独特的实现.因此,无法将访问修饰符指定为私有,因为其他类无法访问它以进行覆盖.

其次,虽然可以启动接口类型的对象,但接口是由实现它的类实现的,而不是继承的.并且由于接口可能由不在同一包中的不相关类实现(实现),因此受保护的访问修饰符也是无效的.所以对于访问修饰符,我们只剩下公共选择.

第三,接口没有任何数据实现,包括实例变量和方法.如果逻辑上有理由在接口中插入已实现的方法或实例变量,那么它必须是继承层次结构中的超类而不是接口.考虑到这一事实,由于无法在接口中实现任何方法,因此接口中的所有方法都必须是抽象的.

第四,接口只能包含常量作为其数据成员,这意味着它们必须是最终的,当然最终常量被声明为静态以仅保留它们的一个实例.因此,静态final也是接口常量必须的.

因此总的来说,虽然在方法和公共静态最终在接口的常量之前使用公共抽象是有效的但是因为没有其他选项,所以它被认为是冗余的而不是使用的.


小智 6

随着引进的privatestaticdefault在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)


Jee*_*Bee 5

我总是写如果没有接口并且我正在编写直接实现,即我将使用public.

  • 您还会显式地将所有接口方法声明为抽象吗? (6认同)
  • 它是一个接口,而不是一个抽象类。至于‘公开’,你想想就已经打了7个字符了,大不了!这也是在实现中定义的方式,+1 表示一致性,平衡 -1 表示冗余。 (5认同)

Phi*_*Lho 5

我会避免放置默认应用的修饰符.正如所指出的,它可能导致不一致和混乱.

我看到的最糟糕的是一个声明方法的接口abstract......


cre*_*zel 5

我使用了public修饰符的declare方法,因为它使代码更具可读性,尤其是语法高亮.在我们的最新项目中,我们使用了Checkstyle,它显示了一个警告,其中包含public接口方法的修饰符的默认配置,所以我切换到省略它们.

所以我不确定什么是最好的,但有一点我真的不喜欢使用public abstract接口方法.Eclipse在使用"Extract Interface"进行重构时有时会这样做.

  • 但是,只有在检查两个复选框时,才将方法声明为public,abstract. (2认同)

swp*_*mer 5

我不同意流行的答案,即公开意味着还有其他选择,因此不应该存在。事实是,现在 Java 9 及以后还有其他选择。

我认为 Java 应该强制/要求指定“公共”。为什么?因为缺少修饰符意味着在其他任何地方都可以“包”访问,并且将其作为特例会导致混淆。如果您只是简单地使用明确的消息(例如“接口中不允许包访问。”)将其设置为编译错误,我们将消除选择忽略“public”所带来的明显歧义。

请注意当前的措辞:https : //docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4

“接口主体中的方法可以声明为publicprivate(第 6.6 节)。如果没有给出访问修饰符,则该方法是隐式公开的。允许但不鼓励在风格上冗余指定公共接口中方法声明的修饰符。”

看到现在允许“私人”。我认为最后一句话应该从 JLS 中删除。不幸的是,“隐式公开”行为曾经被允许,因为它现在可能会保留为向后兼容,并导致混淆,即没有访问修饰符意味着接口中的“公共”和其他地方的“包”。