為何使用預設方法

簡單的答案是,它允許你在不破壞現有實現的情況下發展現有介面。

例如,你有 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 實現將繼承預設實現。