Java8中的接口现在支持在声明方法的同时提供实现,这听起来让人惊讶!通过两种方式可以完成这种操作。其一,Java8允许在接口内声明静态方法。其二,Java8引入了一个新功能,叫默认方法。两个例子就是List接口中的sort,以及Collection接口中的stream。
List接口中的sort方法是Java8中的全新方法,它的定义如下:
default void sort(Comparator<? super E> c) {
Collections.sort(this, c);
}
复制代码
请注意返回类型之前的新default修饰符。通过它,我们能够知道一个方法是否为默认方法。这里的sort方法调用了Collections.sort方法进行排序操作。由于有了这个新的方法,我们现在可以直接通过调用sort,对列表中的元素进行排序。
List<Integer> numbers = Arrays.asList(3, 5, 1, 2, 6);
numbers.sort(Comparator.naturalOrder());// sort是List接口的默认方法
复制代码
不过除此之外,这段代码中还有其他的新东西。注意到了吗,我调用了Comparator.naturalOrder()。这是Comparator接口的一个全新的静态方法,它返回一个Comparator对象,并按自然序列对其中的元素进行排序(即标准的字母数字方式排序)。
Collection中的stream方法的定义如下:
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
复制代码
简而言之,向接口添加方法是诸多问题的罪恶之源;一旦接口发生了变化,实现这些接口的类往往也需要更新,提供新添加方法的实现才能适配接口的变化。如果你对接口以及它所有相关的实现有完全的控制,这可能不是个大问题。但是这种情况是极少的。这就是引入默认方法的目的:它让类可以自动继承接口的一个默认实现。
静态方法及接口
同时定义接口以及工具辅助类是Java语言常用的一种模式,工具类定义了接口实例协作的很多静态方法。比如,Collections就是处理Collection对象的辅助类。由于静态方法可以存在于接口内部,你代码中的这些辅助类就没有存在的必要,你可以把这些静态方法转移到接口内部。为了保持后向的兼容性,这些类依然会存在于Java应用程序的接口之中。