[译]Virtual Extension Methods(or Defender Methods) in Java 8
原文:http://www.javabeat.net/virtual-extension-methods-in-java-8/
作为JSR-335(Lambda项目)的一部分,Java中增加了对闭包的支持。为了支持闭包的使用,在已存在的Java API(Collection APIs为主)中有一些小的改变。其中一个改变就是将要介绍的虚拟扩展方法(Virtual Extension Methods)。 您也可以阅读:
• G1 Garbage Collector in Java 7.0
我们都知道接口不能包含任何方法的实现。为了给新的API提供对闭包的支持并且让使用了这些API的类可以运行在多内核平台上,比如collection中的forEach、map、reduce、filter等方法可以直接被添加到Collection类,或者创建一个新的接口并且让所有collection API实现它,也可以让用户API实现这个新的接口。前两种方法会破坏已经存在的代码,因为接口中的新方法缺少实现。最后一种方法是可行的,但是也不能在外部提高collection API。
处理JSR-335的团队想到的办法是为接口添加default实现,这种方式就为接口实现者提供了覆写方法或就使用该方法的操作。这样在不破坏原有代码结构的情况下新的API就可以被添加到Collection类中同时还为已存在的代码提供了完整的闭包支持。详细深入的文章点这里。
让我们看一下虚拟扩展方法的例子:
|
|
使用“default”关键字我们就可以向已存在的接口中添加新的方法,如果实现接口的类没有覆写这个default方法则它可以直接使用这个default实现。就像:
|
|
上面的代码会输出:
更进一步,我们可以在接口实现类中覆写aDefaulter方法,如下:
|
|
上面的代码输出如下:
|
|
DefenderMethods类的字节码仍然使用invokevirtual操作码调用default方法产生,这表明被调用过程同其他任何普通接口方法一样。
在接下来的文章中,我会讲一些覆写规则、方法调用规则类似的概念,还有一些JDK8中使用了这些特性的例子代码。
相关文章;
1. HashCode and equals methods
2. Generic Methods in Java 5.0
4. Hiding and Overriding Methods In Java
5. Using Lambda Expressions of Java 8 in Java FX event handlers