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

Java接口中的方法应该使用公共访问修饰符声明还是不使用公共访问修饰符声明?,java,interface,coding-style,public-method,Java,Interface,Coding Style,Public Method,Java接口中的方法是否应该使用publicaccess修饰符声明 当然,从技术上讲,这并不重要。实现接口的类方法总是公共。但什么是更好的惯例 Java本身在这方面并不一致。例如,请参见Collection与Comparable,或Future与ScriptEngine,如果没有接口,并且我正在编写一个直接实现,我总是编写我将使用的内容,即,我将使用public,在Java接口中应该省略public修饰符(在我看来) 因为它没有添加任何额外的信息,它只是将注意力从重要的东西上移开 大多数样式指南

Java接口中的方法是否应该使用
public
access修饰符声明

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


Java本身在这方面并不一致。例如,请参见
Collection
Comparable
,或
Future
ScriptEngine
,如果没有接口,并且我正在编写一个直接实现,我总是编写我将使用的内容,即,我将使用
public
,在Java接口中应该省略public修饰符(在我看来)

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

大多数样式指南都会建议您忽略它,但当然,最重要的是在代码库中保持一致,尤其是对于每个接口。下面的示例很容易让一些Java不是100%流利的人感到困惑:

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

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


我所看到的最糟糕的界面是一个声明了
抽象
方法的界面。…

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


有趣的是,C语言设计者决定实施这一点在C#中将接口方法声明为公共实际上是一个编译错误。尽管跨语言的一致性可能并不重要,所以我想这与Java没有直接关系。

我使用了带有
public
修饰符的declare方法,因为它使代码更具可读性,尤其是语法突出显示。不过,在我们最新的项目中,我们使用了Checkstyle,它在接口方法上显示了一个带有
public
修改器默认配置的警告,所以我切换到使用它们

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

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


我宁愿跳过它,我在某个地方读到,默认情况下接口是,
public
abstract

令我惊讶的是,这本书-,正在使用
public
和接口声明和接口方法。。。这让我再一次反思,最终我登上了这篇文章


无论如何,我认为多余的信息应该被忽略

人们将通过在IDE或Javadoc中完成代码来学习您的界面,而不是通过阅读源代码。因此,在源代码中添加“public”是没有意义的,因为没有人阅读源代码。

接口中的方法默认为public和abstract的原因对我来说似乎非常合理和明显

接口中的一种方法。默认情况下,它是抽象的,用于强制实现类提供实现,并且默认情况下是公共的,因此实现类有权这样做


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

尽管这个问题很久以前就被提出了,但我觉得一个全面的描述将澄清为什么不必在方法之前使用公共摘要和接口常量前的公共静态final

首先,接口用于为一组不相关的类指定公共方法,每个类都有一个唯一的实现。因此,不可能将访问修饰符指定为private,因为其他要重写的类无法访问它

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

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

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


总之,虽然在方法之前使用公共抽象和在接口常量之前使用公共静态final是有效的,但由于没有其他选项,因此认为它是多余的,不使用

随着Java 8/9中接口方法的
私有
静态
默认
修饰符的引入,事情变得更加复杂,我倾向于认为完整声明更具可读性(需要Java 9编译):


我不同意流行的答案,即公开意味着有其他选择,因此不应该存在。事实上,现在有了Java9和更高版本,还有其他选择

我认为Java应该强制/要求指定“public”。为什么?因为
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() {}

}