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

当然,从技术上讲,这并不重要。实现接口的类方法总是公共的。但是什么是更好的约定呢?

Java本身在这方面并不一致。参见Collection vs. Comparable或Future vs. ScriptEngine。


当前回答

我将避免使用默认应用的修饰符。正如所指出的,它会导致不一致和混乱。

我见过的最糟糕的是一个方法声明为抽象的接口…

其他回答

我不同意流行的回答,公开意味着有其他选择,所以不应该存在。事实上,现在有了Java 9及以后的版本,就有了其他的选择。

我认为Java应该强制/要求指定“public”。为什么?因为没有修饰符意味着“包”访问其他任何地方,而将其作为特殊情况会导致混淆。如果你只是简单地将其设置为一个带有明确消息的编译错误(例如。“在接口中不允许访问包。”)我们将摆脱选择去掉“public”所带来的明显的模糊性。

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

接口体中的方法可以声明为public或 私人(§6.6)。如果没有给出访问修饰符,则该方法是隐式公共的。这是允许的,但不鼓励 样式,以冗余地指定方法的公共修饰符 在接口中声明。”

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

我总是写我在没有接口的情况下使用的东西,我在写一个直接的实现,也就是说,我将使用public。

接口中的方法在默认情况下是公共和抽象的,这在我看来是很符合逻辑和显而易见的。

接口中的方法在默认情况下是抽象的,用于强制实现类提供实现;在默认情况下是公共的,因此实现类可以访问实现。

在代码中添加这些修饰符是多余和无用的,只会让人认为您缺乏Java基础知识和/或理解。

随着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() {}

}

在Java接口中应该省略公共修饰符(在我看来)。

因为它没有添加任何额外的信息,它只是把注意力从重要的东西上转移开。

大多数风格指南会建议你去掉它,但是当然,最重要的事情是在你的代码库中保持一致,特别是对于每个接口。下面的例子很容易让Java不是100%流利的人感到困惑:

public interface Foo{
  public void MakeFoo();
  void PerformBar();
}