Java 8 最有用的特性之一是default
接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因):
- 提供实际的默认实现。例子:
Iterator.remove()
- 允许 JDK API 进化。例子:
Iterable.forEach()
从 API 设计者的角度来看,我希望能够在接口方法上使用其他修饰符,例如final
. 这在添加便捷方法时很有用,可以防止实现类中的“意外”覆盖:
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
Sender
如果是一个类,以上已经是常见的做法:
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
现在,default
andfinal
显然是矛盾的关键字,但 default 关键字本身并不是严格要求的,所以我假设这种矛盾是故意的,以反映“带主体的类方法”(只是方法)和“接口”之间的细微差别带有主体的方法”(默认方法),即我尚未理解的差异。
在某些时候,还没有完全探索对接口方法等修饰符的支持,static
引用Brian Goetz的话:final
另一部分是我们将在接口中支持类构建工具的程度,例如最终方法,私有方法,受保护方法,静态方法等。答案是:我们还不知道
自 2011 年底以来,显然static
增加了对接口方法的支持。显然,这为 JDK 库本身增加了很多价值,例如Comparator.comparing()
.
问题:
是什么原因final
(也是static final
)从未进入 Java 8 接口?