DESIGN INTERFACES FOR POSTERITY

DESIGN INTERFACES FOR POSTERITY

##概述

在Java8之前,要想往接口添加方法,就必须要破坏现有接口的实现类。在Java时,添加了默认方法构造,使得可以在不破坏现有接口实现类的情况下,可以将方法加入现有接口。

风险

虽然Java加入默认方法使得我们可以往现有接口里添加方法,但这并不保证这些方法会在现有的接口实现类里工作。而在Java8之前,这些接口实现类都是基于默认接口不会添加任何新方法的情况下编写的。

在Java8里,很多新的默认方法被加入到核心的集合接口里,以便促进lambda表达式的使用。

The Java libraries’ default methods are high-quality general-purpose implementations, and in most cases, they work fine. But it is not always possible to write a default method that maintains all invariants of every conceivable implementation.

例如,考虑removeIf方法的情况,这个方法在Java 8里被添加进集合接口。

1
2
3
4
5
6
7
8
9
10
11
12
// Default method added to the Collection interface in Java 8
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean result = false;
for (Iterator<E> it = iterator(); it.hasNext(); ) {
if (filter.test(it.next())) {
it.remove();
result = true;
}
}
return result;
}

虽然这已经是该方法最好的通用实现了,但遗憾的是,它在现实中的一些集合框架里是无法工作的。例如,考虑org.apache.commons.collections4.collection.SynchronizedCollection。这个来自Apache公共库的类,并未覆盖removeIf方法。