1. 程式人生 > >Java 8-介面的預設方法和靜態方法

Java 8-介面的預設方法和靜態方法

Java 8-介面的預設方法和靜態方法

 

Java 8使用兩個新概念擴充套件了介面的含義:預設方法和靜態方法。預設方法使得介面有點類似traits,不過要實現的目標不一樣。預設方法使得開發者可以在 不破壞二進位制相容性的前提下,往現存介面中新增新的方法,即不強制那些實現了該介面的類也同時實現這個新加的方法。

 

預設方法

預設方法和抽象方法之間的區別在於抽象方法需要實現,而預設方法不需要。介面提供的預設方法會被介面的實現類繼承或者覆寫,例子程式碼如下:

private interface Defaulable {
    // Interfaces now allow default methods, the implementer may or 
    
// may not implement (override) them. default String notRequired() { return "Default implementation"; } } private static class DefaultableImpl implements Defaulable { } private static class OverridableImpl implements Defaulable { @Override public String notRequired() {
return "Overridden implementation"; } }

Defaulable介面使用關鍵字default定義了一個預設方法notRequired()

DefaultableImpl類實現了這個介面,同時預設繼承了這個介面中的預設方法;

OverridableImpl類也實現了這個介面,但覆寫了該介面的預設方法,並提供了一個不同的實現。

 

靜態方法

Java 8帶來的另一個有趣的特性是在介面中可以定義靜態方法,例子程式碼如下:

private interface DefaulableFactory {
    
// Interfaces now allow static methods static Defaulable create( Supplier< Defaulable > supplier ) { return supplier.get(); } }

 下面的程式碼片段整合了預設方法和靜態方法的使用場景:

public static void main( String[] args ) {
    Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
    System.out.println( defaulable.notRequired() );
        
    defaulable = DefaulableFactory.create( OverridableImpl::new );
    System.out.println( defaulable.notRequired() );
}

 這段程式碼的輸出結果如下:

Default implementation
Overridden implementation

 

由於JVM上的預設方法的實現在位元組碼層面提供了支援,因此效率非常高。

預設方法允許在不打破現有繼承體系的基礎上改進介面。該特性在官方庫中的應用是:給java.util.Collection介面新增新方法,如stream()parallelStream()forEach()removeIf()等等。

儘管預設方法有這麼多好處,但在實際開發中應該謹慎使用:在複雜的繼承體系中,預設方法可能引起歧義和編譯錯誤。如果你想了解更多細節,可以參考官方文件



作者:杜琪
連結:https://www.jianshu.com/p/5b800057f2d8
來源:簡書