为什么有人将Java接口方法声明为抽象方法?


143

今天,我使用了Eclipse的“拉接口”重构功能来基于现有类创建一个接口。该对话框提供了将新界面的所有新方法创建为“抽象”方法的功能。

这样做的好处是什么?

我认为,允许您将接口方法声明为抽象的事实是该语言的多余且无害的功能,因此不建议特别提倡。

为什么Eclipse支持这种样式,或者为什么有人自愿选择支持这种样式?

澄清:我不是在问为什么接口方法是抽象的,这是显而易见的。我想问为什么人们会明确选择将它们标记为抽象,因为如果它们在接口中,它们无论如何都是抽象的。

Answers:


146

根据Java语言规范abstract用于接口的关键字已过时,不应再使用。(第9.1.1.1节)

也就是说,由于Java具有向后兼容性的倾向,因此我真的怀疑,是否abstract存在该关键字是否会有所不同。


1
那是我的理解(尽管我不熟悉特定的JLS部分)。我想知道为什么Eclipse会为我提供创建过时标记的选项……
Uri 2009年

知道了 必须在某处确定它是理想的“功能”并将其放入。您知道,这些狡猾的开源类型之一:)
jdmichal

18
尽管这是最高评价的答案,但它指的是规范的错误部分;9.1.1.1 abstract在接口本身的声明上而不是在其成员上描述关键字。@Will在下面的答案是正确的,并且还包含有效的链接源。
毛茸茸的青蛙

39

eclipse中的“那个的好处”(在接口方法声明上添加摘要)将是与jdk1.3中的jdt eclipse编译器的旧兼容性问题

从1.4开始,jdk库不再包含默认的抽象方法(在实现接口的抽象类上)。
这愚弄了Eclipse 1.3编译器的诊断,因为它们的实现依赖于它们的存在。
请注意,Javac 1.3将完全拒绝针对1.4库执行操作(使用-bootclasspath选项)。

由于Eclipse编译器可能处于1.4遵从级别(请参阅参考资料Workbench>Preferences>Java>Compiler>JDK Compliance),或者如果使用1.3遵从模式,则至少使用1.3类库,因此在当前的大多数Eclipse项目中都不需要“抽象”。


3
好发现。因此,它具有解决Eclipse编译器中不再存在的问题的功能。
jdmichal

1
@jdmichal:的确如此,这也是对Uri问题的更准确答案。
VonC

39

Java SE 7 JLS(Java语言规范)中:“允许,但出于风格考虑,不建议为接口中声明的方法冗余地指定public和/或abstract修饰符。”

对于Java SE 5.0:“为了与Java平台的较早版本兼容,出于风格考虑,允许但不建议为接口中声明的方法冗余地指定abstract修饰符。”


9

根据JLS,接口中的方法默认情况下是抽象的,因此关键字是多余的。知道这一点,我将永远不会使用它来“避免呈现混乱”。


这应该是正确的答案。这是更新的链接 -请参阅“注释”部分
-mork

JLS并没有说该关键字对于接口中的方法已过时。它说:“为允许在接口中声明的方法冗余地指定public和/或abstract修饰符,但在样式方面不建议这样做。” JLS#9.4
洛恩侯爵,2015年

@EJP我不是说JLS说过该关键字会过时,这是我个人的看法; 。现在,我知道我将编辑答案以澄清此问题。
Daniel Hiller 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.