public
和abstract
修饰符对于接口方法声明来说是多余的。
是否有可能通过某种日食偏好删除这些修饰符?
接口方法的“公共”和“公共最终”是多余的吗?
是。
接口中的所有方法都是隐式公共和抽象的(但不是最终的)。
界面中的所有字段都是隐式公共,静态和最终的。
JLS声明了这一点。它还指出可以省略这些修饰符。
为什么?那么有很多原因:
字段和方法是隐式公共的,因为接口的要点是声明其他类可以看到的...接口。 (如果您想/需要限制访问,可以通过界面本身的访问修饰符完成。)
字段是静态的,因为如果它们不是你将在对象上声明可见的实例字段......这对于封装来说是不好的。
字段是最终的,因为非最终字段将是另一种声明公共静态字段的方式......从OO角度来看这是非常糟糕的。
方法是抽象的,因为允许方法体有效地将接口转换为抽象类。
在接口中使方法抽象和字段静态的另一个原因是,如果它们没有,菱形继承和来自两个不同接口的方法的继承都将是有问题的。
但无论哪种方式,这都是Java的定义方式,所以问题没有实际意义......除非您考虑发明自己的编程语言。
请注意,在Java 8中,您可以使用默认修饰符在接口中声明方法。在Java 9中,您可以在某些情况下声明私有方法。但是使用public关键字仍然是多余的。
我为什么要删除它们?
您不必删除它们。 Java编译器并不关心。您可以删除它们,但不必删除它们,除非您尝试遵循一些坚持这一点的Java样式指南。如果您的代码是一致的,它会使您的代码更具可读性,但您可以通过在任何地方使用冗余修饰符来使其保持一致。
这是不是意味着我想要通过任何类实现add方法,而remove方法只能由同一个包的类实现?
不,这并不意味着。或者至少,它可能意味着对你而言,但这并不意味着对Java编译器,其他Java工具......或其他人阅读和维护你的代码。国际海事组织,对冗余关键字的存在与否赋予任何意义是不明智的。