为何使用默认方法
简单的答案是,它允许你在不破坏现有实现的情况下发展现有接口。
例如,你有 20 年前发布的 Swim
接口。
public interface Swim {
void backStroke();
}
我们做得很好,我们的界面很受欢迎,世界各地都有很多实现,你无法控制它们的源代码。
public class FooSwimmer implements Swim {
public void backStroke() {
System.out.println("Do backstroke");
}
}
20 年后,你决定在界面中添加新功能,但看起来我们的界面被冻结,因为它会破坏现有的实现。
幸运的是 Java 8 引入了名为 Default method 的全新功能。
我们现在可以为 Swim
接口添加新方法。
public interface Swim {
void backStroke();
default void sideStroke() {
System.out.println("Default sidestroke implementation. Can be overridden");
}
}
现在,我们接口的所有现有实现仍然可以工作。但最重要的是,他们可以在自己的时间内实施新增的方法。
这种变化的最大原因之一,也是其最大的用途之一,就是 Java Collections 框架。Oracle 无法在不破坏实现 Iterable 的所有现有代码的情况下将 foreach
方法添加到现有的 Iterable 接口。通过添加默认方法,现有的 Iterable 实现将继承默认实现。