為何使用預設方法
簡單的答案是,它允許你在不破壞現有實現的情況下發展現有介面。
例如,你有 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 實現將繼承預設實現。