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

你可能感兴趣的:(java,jdk,swing,interface,extension,methods)