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提议!