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

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

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


当前回答

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

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

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

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

其他回答

JLS明确了这一点:

允许为接口中声明的方法冗余地指定公共和/或抽象修饰符,但出于风格考虑,不建议这样做。

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

}

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

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

我使用带有公共修饰符的声明方法,因为它使代码更具可读性,特别是语法高亮显示。不过,在我们最新的项目中,我们使用了Checkstyle,它在接口方法上的公共修饰符的默认配置中显示了一个警告,所以我切换到忽略它们。

我不确定什么是最好的,但我不喜欢在接口方法上使用公共抽象。Eclipse在使用“Extract Interface”重构时有时会这样做。

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

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

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

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