預設方法的使用模式

Philip發表於2018-09-05

可選方法

你很可能也碰到過這種情況,類實現了介面,不過刻意地將一些方法的實現留白。我們以Iterator介面為例來說。Iterator介面定義了hasNext、next,還定義了remove方法。Java8之前,由於使用者通常不會使用該方法,remove方法常被忽略。因此,實現Iterator介面的類通常會為remove方法放置一個空的實現,這些都是毫無用處的模板程式碼。

採用預設方法之後,你可以為這種型別的方法提供一個預設的實現,這樣實體類就無需在自己的實現中顯式地提供一個空方法。比如,在Java8中,Iterator介面就為remove方法提供了一個預設實現,如下所示:

interface Iterator<T> {
    boolean hasNext();
    T next();
    default void remove() {
        throw new UnsupportedOperationException();
    }
}
複製程式碼

通過這種方式,你可以減少無效的模板程式碼。實現Iterator介面的每一個類都不需要在宣告一個空的remove方法了,因為它現在已經有一個預設的實現。

行為的多繼承

預設方法讓之前無法想象的事兒以一種優雅的方式得以實現,即行為的多繼承。這是一種讓類從多個來源重用程式碼的能力。Java的類只能繼承單一的類,但是一個類可以實現多介面。配合預設方法,就可以以優雅的方式實現多繼承。

相關文章