Java 8 Defender 方法

来源:互联网 发布:淘宝a店是什么意思啊 编辑:程序博客网 时间:2024/06/01 10:07

        在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java;

  Brian Goetz有个关于Java语言改变的提议,Defender methods,这个提议定义了一个abstract方法的默认实现,这个想法很好,不过感觉extension这个关键字有点多余,如果定义一个abstract方法有个default的实现,为什么不是所有的abstract方法都有这个功能,而仅仅是标示为extension这个关键字的方法,另外提议也说明了这种解决办法还是难以取代一个接口的skeletal实现类:

  提议中的例子:

  view plain public interface Set extendsCollection { extension public int

  size()

  default AbstractSetMethods.size;extensionpublic boolean isEmpty()

  default AbstractSetMethods.isEmpty;// Therest of the Set methods, most having defaults }

  这个提议貌似是为了解决Collection类的问题,但是对于一些事件Listener,则没有更好的办法,熟悉AWT和Swing GUI类库的同学都知道,像KeyListener,还有个对应的KeyAdapter,这个类覆盖所有的方法,方法体中都是空的,这样的事件类很多,基本上没有什么用,只是为了覆盖方便,不知道读Swing源代码的同学注意到了没有,Swing界面库本身从来不用这些类,你可能会问,为什么不用?其实直接实现接口如KeyListener更简单,如果继承KeyAdapter,有可能会出现方法不能正确覆盖的错误,当然,加上@Override标注后在编译时能够检测出来这些问题,更进一步,通过直接实现接口KeyListener,可以将控件或者GUI程序的所有事件类集中到一个类中,通过一个类实现多个接口,减少类的数目,为什么要减少类的数目,这是除了以前提到Swing单线程问题之外,另一个关于SwingGUI性能问题的关键(针对这个问题,Swing核心类库,就是javax.swing.plaf包中的几乎所有的XXXUI类都进行了改造,忘了是从JDK1.4还是JDK1.5开始),以后有机会再谈,现在想了解这个问题的同学可以看看BasicTreeUI这个类的内部类Handler和方法getHandler()方法,同一个包中几乎所有的XXXUI都有一个这样的内部类。

  我个人不是Java语言层面的专家,但是建议如果接口的所有方法都能够支持添加个default实现,就非常方便了,这样KeyAdapter这个类就不需要了,事件接口都这样定义:

  view plain public interface KeyListenerextends EventListener { public void

  keyTyped(KeyEvent e) default;public voidkeyPressed(KeyEvent e) default;public

  void keyReleased(KeyEvent e) default;}default后没有定义静态方法,就默认这个方法没有被子类覆盖时是个空的实现,如果不定义default子句,则和原来的行为一样,子类没有覆盖时编译提示出错!

  类似事件类型这种类目前Lambda 也就是JavaClosure提议也没有很好的解决办法,目前的Java Closure提议主要是解决类似Runnable这样只有一个方法的接口的问题的,就是不需要提供一个Runnable子类,提供个Closure函数对象就可以调用了,以后有空再谈Java 8 即将添加的Closure提议!

  疯狂Java培训的课程采用针对性培养,全面提升学员就业能力,重点加强训练职业素质。老师辛勤的讲解,让学员充分感受Java的魅力,充分激发每个学员对于编程的热爱,让学员在半年的时间内掌握8-10万的代码量,成为真正的技术高手,疯狂Java采用企业全真模拟开发训练,迅速积累项目经验。让学员迅速获得其他人需要花费两年才能获得的工作技能,无忧就业!

 

原创粉丝点击