Java8最有用的特性之一是接口上的新的default
个方法.它们被引入的主要原因有两个(可能还有其他原因):
- 提供实际的默认实现.示例:
Iterator.remove()
- 允许JDK API的发展.示例:
Iterable.forEach()
从API设计师的Angular 来看,我希望能够在接口方法上使用其他修饰符,例如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
和final
显然是相互矛盾的关键字,但是默认关键字本身是would not have been strictly required,所以我假设这个矛盾是故意的,以反映"class methods with body"(只是方法)和"interface methods with body"(默认方法)之间的细微差别,即我还没有理解的差别.
在某些时候,对接口方法上的static
和final
这样的修饰符的支持还没有得到充分探索,citing Brian Goetz:
另一部分是我们将在多大程度上支持班级建设
显然,自2011年底以来,接口中增加了对static
个方法的支持.显然,这为JDK库本身增加了很多价值,比如Comparator.comparing()
.
问题:
为什么final
个(以及static final
个)从未实现Java8接口?