Java 8-介面的預設方法和靜態方法
阿新 • • 發佈:2018-12-07
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
來源:簡書