Java 8 Defender 方法

Brian Goetz有個關於Java語言改變的提議,Defender methods,這個提議定義了一個abstract方法的默認實現,這個想法很好,不過感覺extension這個關鍵字有點多餘,如果定義一個abstract方法有個default的實現,爲什麼不是所有的abstract方法都有這個功能,而僅僅是標示爲extension這個關鍵字的方法,另外提議也說明了這種解決辦法還是難以取代一個接口的skeletal實現類:

提議中的例子:

public interface Set<T> extends Collection<T> { 
    extension public int size() 
        default AbstractSetMethods.size; 
    extension public boolean isEmpty() 
        default AbstractSetMethods.isEmpty; 
    // The rest of the Set methods, most having defaults 
} 

這個提議貌似是爲了解決Collection類的問題,但是對於一些事件Listener,則沒有更好的辦法,熟悉AWT和Swing GUI類庫的同學都知道,像KeyListener,還有個對應的KeyAdapter,這個類覆蓋所有的方法,方法體中都是空的,這樣的事件類很多,基本上沒有什麼用,只是爲了覆蓋方便,不知道讀Swing源代碼的同學注意到了沒有,Swing界面庫本身從來不用這些類,你可能會問,爲什麼不用?其實直接實現接口如KeyListener更簡單,如果繼承KeyAdapter,有可能會出現方法不能正確覆蓋的錯誤,當然,加上@Override標註後在編譯時能夠檢測出來這些問題,更進一步,通過直接實現接口KeyListener,可以將控件或者GUI程序的所有事件類集中到一個類中,通過一個類實現多個接口,減少類的數目,爲什麼要減少類的數目,這是除了以前提到Swing單線程問題之外,另一個關於Swing GUI性能問題的關鍵(針對這個問題,Swing核心類庫,就是javax.swing.plaf包中的幾乎所有的XXXUI類都進行了改造,忘了是從JDK1.4還是JDK1.5開始),以後有機會再談,現在想了解這個問題的同學可以看看BasicTreeUI這個類的內部類Handler和方法getHandler()方法,同一個包中幾乎所有的XXXUI都有一個這樣的內部類。

我個人不是Java語言層面的專家,但是建議如果接口的所有方法都能夠支持添加個default實現,就非常方便了,這樣KeyAdapter這個類就不需要了,事件接口都這樣定義:

public interface  KeyListener extends EventListener {
    public void keyTyped(KeyEvent e) default;
    public void keyPressed(KeyEvent e) default;
    public void keyReleased(KeyEvent e) default;
}
default後沒有定義靜態方法,就默認這個方法沒有被子類覆蓋時是個空的實現,如果不定義default子句,則和原來的行爲一樣,子類沒有覆蓋時編譯提示出錯!

類似事件類型這種類目前Lambda 也就是Java Closure提議也沒有很好的解決辦法,目前的Java Closure提議主要是解決類似Runnable這樣只有一個方法的接口的問題的,就是不需要提供一個Runnable子類,提供個Closure函數對象就可以調用了,以後有空再談Java 8 即將添加的Closure提議!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章