40


我正在阅读这篇文章为什么要在 Java 中使用静态嵌套接口?特别是第一个答案。在那个答案中,在接口字段上使用“public”或“public final”这些词是多余的。我的问题是:为什么?我为什么要删除它们?如果我有这样的事情:

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

这是否意味着我希望add方法由任何类实现,而remove方法只能由同一个包的类实现?

4

5 回答 5

101

接口方法的“public”和“public final”是多余的吗?

是的。

接口中的所有方法都是隐式的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 工具……或其他阅读和维护您的代码的人并不意味着。IMO,不建议对冗余关键字的存在或不存在赋予任何含义。

于 2013-06-09T15:57:34.557 回答
10

您不能final在接口中声明方法。字段总是final,但方法总是abstract(而且从不final)。您不能定义仅由同一包中的类实现的接口方法。*来自Java 语言规范的第 9.3 节

接口主体中的每个字段声明都是隐式公共的、静态的和最终的。允许为这些字段冗余地指定任何或所有这些修饰符。

并从第 9.4 节

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

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

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

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

于 2013-06-09T15:54:28.137 回答
2
  • 根据定义,接口是抽象的,因此接口上的 abstract 修饰符是多余的。
  • 接口和注解中的变量自动是公共的、静态的和最终的,因此这些修饰符也是多余的。
  • 由于注解是一种接口形式,它们的字段也自动是公共的、静态的和最终的,就像它们的注解字段是自动公共的和抽象的一样。
  • 根据定义,final 类不能扩展,因此 final 类的方法上的 final 修饰符是多余的。

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

于 2015-04-15T08:08:22.050 回答
1

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

我认为添加public, or是一种不好的风格abstract,因为两者都是隐式应用的。

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

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

来自Java 语言规范(JLS)

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

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

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

于 2013-06-09T15:55:39.563 回答
0

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

于 2013-06-09T15:55:03.553 回答