即将发布的Java 8版本中的虚拟扩展方法
当我看到代码片段之类的时候
interface A { void a(); void b() default { System.out.println("b"); }; void c() final { System.out.println("c"); }; }
我有一个问题。 我们还没有得到足够的Java? 为什么人们可能需要这个?
我建议你看一下这个会议: http : //medianetwork.oracle.com/media/show/16999
这解释了一切。 最有趣的事情是允许接口进化而不重写整个代码库。 这是允许大型代码库发展而不是变得越来越残缺的关键。
我们需要这个,因为它会让Scala家伙非常愤怒。 它们已经具有“特征”形状的相似function,所以现在他们必须将这些function与这些function结合起来。
在Java语言开发中,Scala家伙的贬低实际上是最高优先级。
计划Java 8将包含某种forms的lambda和闭包支持,这将是Java语言现代化的重要一步。 问题是基于接口的现有库(如集合框架)将无法直接使用这些新function。 在不破坏现有实现的情况下,无法向接口添加方法,它们将不再简单地编译。
拥有lambdas但不能轻易地将它们与标准集合一起使用,对于Java开发人员来说将是一个巨大的失望。 要将lambda集成到标准集合中,非常需要像forEach
, map
或filter
这样的方法。
此问题的解决方案是添加另一个function,即扩展方法,它定义接口中方法的默认实现。 现有的子类将使用默认方法,但也可以使用专门的,可能更好的实现来覆盖该方法。
有关扩展方法提议的更多信息,请参阅Java Enhancement Proposal 126 。
这很棒,因为它允许API编写器在不引起NoSuchMethodErrors的情况下进行post-hoc扩展接口。 它还为V2中针对V1编译的类提供了方法的默认实现; 代码就像一个魅力。 这也允许您像往常一样覆盖针对V2编译的类中的默认实现,并使编号的interfces冗余。 我认为它也优于使用站点扩展方法。
我相信“扩展方法”概念不过是破解/修复设计不佳的API的最后机会,这些API已经暴露于“外部世界”。 只是语法糖。
- 高性能JMS消息传递
- Java NoSuchMethodException – 类中确实存在方法
- 在eclipse中使用java.io库,因此FileInputStream可以读取dat文件
- 在inheritance的情况下使用model.getClass()。getMethod的问题
- Java Swing通过鼠标单击和拖动绘制线条
- Spring FileUpload问题
- 在Java中生成JAXB类时添加toString,hashCode,equals
- 在它前面具有零的整数是什么意思,我该如何打印它?
- SpelEvaluationException:EL1004E:(pos 0):方法调用:在MethodSecurityExpressionRoot类型上找不到方法hasPermission(java.lang.String)