在 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
沒有留言:
張貼留言