Java8新特性第2章(介面預設方法)

張磊BARON發表於2016-09-17

轉載請註明出處:www.jianshu.com/p/2b6880cb9…
歡迎大家關注我的知乎專欄:zhuanlan.zhihu.com/baron


在Java中一個介面一旦釋出就已經被定型,除非我們能夠一次性的更新所有該介面的實現,否者在介面的新增新方法將會破壞現有介面的實現。預設方法就是為了解決這一問題的,這樣介面在釋出之後依然能夠繼續演化。

預設方法就是向介面增加新的行為。它是一種新的方法:介面方法可以是抽象的或者是預設的。預設方法擁有預設實現,介面實現類通過繼承得到該預設實現。預設方法不是抽象的,所以我們可以放心的向函式式介面裡增加預設方法,而不用擔心函式式介面單抽象方法的限制。

public interface Iterator<E> {

    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}複製程式碼

和其他方法一樣,預設方法也可以被繼承。

除了上面看到的預設方法,Java8中還允許我們在介面中定義靜態方法。這使得我們可以從介面中直接呼叫它相關的輔助方法,而不是從其它的輔助類中呼叫(如Collections)。在做集合中元素比較的時候,我們一般需要使用靜態輔助方法生成實現Comparator的比較器,在Java8中我們可以直接把該靜態方法定義在Comparator介面中:

public static <T, U extends Comparable<? super U>>
    Comparator<T> comparing(Function<T, U> keyExtractor) {
    return (c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}複製程式碼

如果大家喜歡這一系列的文章,歡迎關注我的知乎專欄、GitHub、簡書部落格。

相關文章