可选方法
你很可能也碰到过这种情况,类实现了接口,不过刻意地将一些方法的实现留白。我们以Iterator接口为例来说。Iterator接口定义了hasNext、next,还定义了remove方法。Java8之前,由于用户通常不会使用该方法,remove方法常被忽略。因此,实现Iterator接口的类通常会为remove方法放置一个空的实现,这些都是毫无用处的模板代码。
采用默认方法之后,你可以为这种类型的方法提供一个默认的实现,这样实体类就无需在自己的实现中显式地提供一个空方法。比如,在Java8中,Iterator接口就为remove方法提供了一个默认实现,如下所示:
interface Iterator<T> {
boolean hasNext();
T next();
default void remove() {
throw new UnsupportedOperationException();
}
}
通过这种方式,你可以减少无效的模板代码。实现Iterator接口的每一个类都不需要在声明一个空的remove方法了,因为它现在已经有一个默认的实现。
行为的多继承
默认方法让之前无法想象的事儿以一种优雅的方式得以实现,即行为的多继承。这是一种让类从多个来源重用代码的能力。Java的类只能继承单一的类,但是一个类可以实现多接口。配合默认方法,就可以以优雅的方式实现多继承。