Brian Goetz有個關於Java語言改變的提議Defender methods這個提議定義了一個abstract方法的默認實現這個想法很好不過感覺extension這個關鍵字有點多余如果定義一個abstract方法有個default的實現為什麼不是所有的abstract方法都有這個功能而僅僅是標示為extension這個關鍵字的方法另外提議也說明了這種解決辦法還是難以取代一個接口的skeletal實現類
提議中的例子
view plain public interface Set<T> extends Collection<T> { extension public int size()
default AbstractSetMethodssizeextension public boolean isEmpty()
default AbstractSetMethodsisEmpty// 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核心類庫就是javaxswingplaf包中的幾乎所有的XXXUI類都進行了改造忘了是從JDK還是JDK開始)以後有機會再談現在想了解這個問題的同學可以看看BasicTreeUI這個類的內部類Handler和方法getHandler()方法同一個包中幾乎所有的XXXUI都有一個這樣的內部類
我個人不是Java語言層面的專家但是建議如果接口的所有方法都能夠支持添加個default實現就非常方便了這樣KeyAdapter這個類就不需要了事件接口都這樣定義
view plain public interface KeyListener extends EventListener { public void keyTyped(KeyEvent e) defaultpublic void keyPressed(KeyEvent e) defaultpublic void keyReleased(KeyEvent e) default} default後沒有定義靜態方法就默認這個方法沒有被子類覆蓋時是個空的實現如果不定義default子句則和原來的行為一樣子類沒有覆蓋時編譯提示出錯!
類似事件類型這種類目前Lambda 也就是Java Closure提議也沒有很好的解決辦法目前的Java Closure提議主要是解決類似Runnable這樣只有一個方法的接口的問題的就是不需要提供一個Runnable子類提供個Closure函數對象就可以調用了以後有空再談Java 即將添加的Closure提議!
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27031.html