Java 8最有用的特性之一是接口上新的default
方法。它们被引入的主要原因有两个(可能还有其他原因):
Iterator.remove()
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
和final
显然是矛盾的关键字,但默认关键字本身不是严格要求的吗,所以我假设这个矛盾是故意的,以反映“类方法与body”;(只是方法)和“接口方法与本体”;(默认方法)之间的微妙差异,即我还没有理解的差异。
在某些时候,接口方法对static
和final
等修饰符的支持还没有完全探索,引用布莱恩·戈茨的话:
另一部分是我们将在多大程度上支持班级建设 接口中的工具,如final方法、私有方法、受保护 方法,静态方法等等。答案是:我们还不知道
从2011年末开始,显然,接口中增加了对static
方法的支持。显然,这为JDK库本身增加了很多价值,比如Comparator.comparing()
。
是什么原因final
(以及static final
)从未出现在Java 8接口中?