2020/07/24

[筆記] Effective Java #21 為後代設計介面

Effective Java 3rd 簡體中文版筆記 #21 為後代設計介面
在 Java 8 前,介面 (interface) 一旦發佈新的方法,實作該介面的 class 就會存在編譯錯誤的危險,當 dependency 升版後,該 class 沒有實作新方法,就會發生編譯錯誤。在 Java 8 允許介面可以提供預設方法 (default method),當介面新增方法時就實作預設方法,讓已實作該介面的 class,避免上述的問題。Java 8 Collection 介面新增 removeIf 預設方法,但並非所有的 class 都適用,像是 Apache Common 中的 SynchronizedCollection,它並沒有覆寫 removeIf,所以繼承預設方法,但是如果調用預設的 removeIf,會產生例外 (exception) 。
// java.util.Collection interface
default boolean removeIf(Predicate<? super E> filter) {
    Objects.requireNonNull(filter);
    boolean removed = false;
    final Iterator<E> each = iterator();
    while (each.hasNext()) {
        if (filter.test(each.next())) {
            each.remove();
            removed = true;
        }
    }
}
雖然 Java 8 已提供介面的預設方法,但仍須謹慎設計,確保該介面是合理適用的。

轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2020/07/effective-java-21-interface.html

沒有留言:

張貼留言