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

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

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


当前回答

这完全是主观的。我省略了多余的公共修饰符,因为它看起来很杂乱。正如其他人所提到的,一致性是这个决定的关键。

有趣的是,c#语言设计人员决定强制执行这一点。在c#中将接口方法声明为public实际上是一个编译错误。不过,一致性在语言之间可能并不重要,所以我猜这与Java并没有直接关系。

其他回答

JLS明确了这一点:

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

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

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

在代码中添加这些修饰符是多余和无用的,只会让人认为您缺乏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() {}

}

这完全是主观的。我省略了多余的公共修饰符,因为它看起来很杂乱。正如其他人所提到的,一致性是这个决定的关键。

有趣的是,c#语言设计人员决定强制执行这一点。在c#中将接口方法声明为public实际上是一个编译错误。不过,一致性在语言之间可能并不重要,所以我猜这与Java并没有直接关系。

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