![](/img/trans.png)
[英]Is “public static final” redundant for a constant in a Java interface?
[英]Are “public” and “public final” redundant for interface fields?
我正在阅读这篇文章为什么在Java中使用静态嵌套接口? 特别是第一个答案。 在该答案中写道,在界面字段上使用“public”或“public final”这些词是多余的。 我的问题是:为什么? 我为什么要删除它们? 如果我有这样的事情:
public interface Int1 {
public void add();
void remove();
}
这不是说我希望add
方法由任何类实现而remove
方法只能由我同一个类的类实现吗?
接口方法的“公共”和“公共最终”是多余的吗?
是。
接口中的所有方法都是隐式public
和abstract
(但不是final
)。
界面中的所有字段都是隐式public
, static
和final
。
JLS声明了这一点。 它还指出可以省略这些修饰符。
为什么? 那么有很多原因:
字段和方法是隐式public
因为接口的要点是声明其他类可以看到的...接口。 (如果您想/需要限制访问,可以通过界面本身的访问修饰符完成。)
字段是static
因为如果它们不是你将在对象上声明可见的实例字段......这对于封装来说是不好的。
字段是final
因为非最终字段将是另一种声明public
static
字段的方式......从OO角度来看这是非常糟糕的。
方法是abstract
因为允许方法体有效地将接口转换为抽象类。
在接口中使方法抽象和字段静态的另一个原因是,如果它们没有,菱形继承和来自两个不同接口的方法的继承都将是有问题的。
但无论哪种方式,这都是Java的定义方式,所以问题没有实际意义......除非您考虑发明自己的编程语言。
请注意,在Java 8中,您可以使用default
修饰符在接口中声明方法。 在Java 9中,您可以在某些情况下声明private
方法。 但是使用public
关键字仍然是多余的。
我为什么要删除它们?
您不必删除它们。 Java编译器并不关心。 你可以删除它们,但你不必删除它们,除非你试图顺应一些Java的指导原则,坚持这一点。 如果您的代码一致,您的代码可能会更具可读性,但您可以通过在任何地方使用冗余修饰符来使其保持一致; 例如,添加它们而不是删除它们。
这是不是意味着我想要通过任何类实现add方法,而remove方法只能由同一个包的类实现?
不,这并不意味着。 或者至少,它可能意味着对你而言 ,但这并不意味着对Java编译器,其他Java工具......或其他人阅读和维护你的代码。 国际海事组织,对冗余关键字的存在与否赋予任何意义是不明智的。
您不能在接口中声明final
方法。 字段总是final
但方法总是abstract
(而且永远不是final
)。 您无法定义仅由同一包中的类实现的接口方法。 *来自Java语言规范的9.3节 :
接口主体中的每个字段声明都是隐式的public,static和final。 允许为这些字段冗余地指定任何或所有这些修饰符。
从第9.4节 :
接口主体中的每个方法声明都是隐式公共的(第6.6节)。
接口主体中的每个方法声明都是隐式抽象的,因此它的主体始终用分号表示,而不是块。
允许但不鼓励作为样式,为接口中声明的方法冗余地指定公共和/或抽象修饰符。
*正如Paul Bellora在评论中指出的那样,如果您想限制其可见性,您可以将界面本身打包为私有(或受保护,甚至私有)。
阅读本文: http : //checkstyle.sourceforge.net/config_modifier.html
是的,公众是多余的,因为在Interface
所有方法都是public
和abstract
。
我认为添加public
或abstract
是一种糟糕的风格,因为两者都是隐式应用的。
public interface Int1 {
void add();
void remove();
}
这看起来更干净,并且表明你知道它们是公开的
来自Java语言规范 (JLS)
9.4。 抽象方法声明
接口主体中的每个方法声明都是隐式公共的(第6.6节)。接口主体中的每个方法声明都是隐式抽象的,因此它的主体始终用分号表示,而不是块。
允许但不鼓励作为样式,为接口中声明的方法冗余地指定公共和/或抽象修饰符。
我在没有方法的public
关键字的情况下编写接口。 这是多余的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.