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

zer*_*uno 28 java interface


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

public interface Int1 {
   public void add();
   void remove(); 
}
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 83

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

是.

在接口中的所有方法都隐式publicabstract(但不包括final).

界面中的所有字段都是隐式的public,staticfinal.

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


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

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

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

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

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

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

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

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


我为什么要删除它们?

您不必删除它们.Java编译器并不关心.你可以删除它们,但你并不需要删除它们,除非你试图顺应一些Java的指导原则,坚持这一点.如果您的代码是一致的,它会使您的代码更具可读性,但您可以通过在任何地方使用冗余修饰符来使其保持一致.

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

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


Ted*_*opp 9

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

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

第9.4节:

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

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

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

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