接口字段的“公共”和“公共最终”是多余的吗?

时间:2013-06-09 15:53:19

标签: java interface


我正在阅读这篇文章Why would a static nested interface be used in Java?,尤其是第一个答案。在该答案中写道,在界面字段上使用“public”或“public final”这些词是多余的。我的问题是:为什么? 我为什么要删除它们?如果我有这样的事情:

public interface Int1 {
   public void add();
   void remove(); 
}

这不是说我希望add方法由任何类实现,而remove方法只能由同一个包的类实现吗?

5 个答案:

答案 0 :(得分:78)

  

接口方法的“公共”和“公共最终”是多余的吗?

界面中的所有方法都隐含publicabstract(但不是final)。

界面中的所有字段都隐含publicstaticfinal

JLS声明了这一点。它还指出可以省略这些修饰语。


为什么呢?那么有很多原因:

  • 字段和方法是隐式public,因为接口的要点是声明其他类可以看到的...接口。 (如果您想要/需要限制访问,可以通过界面本身的访问修饰符来完成。)

  • 字段为static,因为如果它们不是,您将在对象上声明可见的实例字段......这对于封装来说是不好的。

  • 字段为final,因为非最终字段是声明public static字段的另一种方式......从OO的角度来看这很糟糕。

  • 方法是abstract,因为允许方法体有效地将接口转换为抽象类。

在接口中使方法抽象和字段静态的另一个原因是,如果它们没有,菱形继承和从两个不同接口继承方法都会产生问题。

但无论如何,这就是Java的定义方式,所以这些问题都没有实际意义......除非您考虑发明自己的编程语言。

请注意,在Java 8中,可以使用default修饰符在接口中声明方法。在Java 9中,在某些情况下,可以声明private方法。但使用public关键字仍然是多余的。


  

我为什么要删除它们?

您不必删除它们。 Java编译器并不关心。 您可以删除它们,但您不必删除它们,除非您尝试遵循一些坚持这一点的Java样式指南。 如果您的代码一致,您的代码可能会更具可读性,但您可以通过在任何地方使用冗余修饰符来使其保持一致;例如添加它们而不是删除它们。

  

这不是说我希望add方法可以由任何类实现,而remove方法只能由同一个类的类实现吗?

不,这并不意味着。或者至少,它可能意味着给你,但它并不意味着对Java编译器,其他Java工具......或其他人阅读和维护你的代码。国际海事组织,将任何意义置于是否存在冗余关键字是不明智的。

答案 1 :(得分:9)

您不能在接口中声明final方法。字段始终为final,但方法始终为abstract(永不final)。您无法定义仅由同一包中的类实现的接口方法。 * 来自section 9.3 of the Java Language Specification

  

接口主体中的每个字段声明都是隐式的public,static和final。允许为这些字段冗余地指定任何或所有这些修饰符。

section 9.4

  

接口主体中的每个方法声明都是隐式公共的(第6.6节)。

     

接口主体中的每个方法声明都是隐式抽象的,因此它的主体总是用分号表示,而不是块。

     

允许但不鼓励作为样式,为接口中声明的方法冗余地指定公共和/或抽象修饰符。

* 正如Paul Bellora在评论中指出的那样,如果您想限制其可见性,您可以将界面本身打包为私有(或受保护,甚至私有)。

答案 2 :(得分:2)

  • 接口按定义是抽象的,因此接口上的abstract修饰符是多余的。
  • 接口和注释中的变量自动为public,static和final,因此这些修饰符也是多余的。
  • 由于注释是一种界面形式,它们的字段也是自动公共的,静态的和最终的,因为它们的注释字段是自动公开和抽象的。
  • 根据定义的最终类不能扩展,因此最终类方法的最终修饰符是多余的。

阅读本文:http://checkstyle.sourceforge.net/config_modifier.html

答案 3 :(得分:1)

是公众是多余的,因为在Interface中,所有方法都隐含publicabstract

我认为添加publicabstract是一种糟糕的风格,因为两者都是隐式应用的。

public interface Int1 {
   void add();
   void remove(); 
}

这看起来更干净,并且表明你知道它们是公开的

来自Java Language Specification(JLS)

  

9.4。摘要方法声明
  接口主体中的每个方法声明都是隐式公共的(第6.6节)。

     

接口主体中的每个方法声明都是隐式的   抽象,所以它的身体总是用分号代表,而不是分号   块。

     

这是允许的,但是作为一种风格的劝阻,是多余的   为在其中声明的方法指定public和/或abstract修饰符   界面。

答案 4 :(得分:0)

我为方法编写了没有public关键字的接口。这是多余的。