那么 Java 7 最终会获得闭包吗?最新消息是什么?
6 回答
是的,Java 7 的发布计划包括关闭(这是将发布从冬季推迟到秋季的最重要原因(预计在 2010 年 9 月))。
最新消息可以在Project Lambda中找到。您可能也有兴趣阅读最新的规范草案。
目前没有关于关闭状态的官方声明。
以下是一些关于它如何工作和看起来如何的可读示例。
如果您想深入了解正在发生的事情,请参阅OpenJDK 邮件列表。
概述
基本上有一些希望,因为代码和一些测试已经提交到一些源代码分支,并且至少有一些中途工作的基础设施来测试它。
Maurizio Cimadamore的变更信息如下:
初始 lambda 推送;当前原型支持以下功能:
- 函数类型语法(可选地使用 -XDallowFunctionTypes 启用)
- 函数类型子类型化
- 完全支持类型 1 和 2 的 lambda 表达式
- 推断 lambda 中的抛出类型/返回类型
- 使用 v0.1.5 草案中指定的规则进行 lambda 转换
- 支持对“this”的引用(显式和隐式)
- 使用方法句柄进行翻译
修改后的 langtools 存储库的脚本构建现在生成一个名为 javacrt.jar 的附加 jar 文件,其中包含要在 SAM 转换期间使用的帮助程序类;在构建之后,生成的脚本 javac/java 将负责自动设置所需的依赖项,以便可以编译和执行包含 lambda 表达式的代码。
但这是正在进行的工作,目前还存在相当多的问题。例如,编译器有时会在有效表达式上崩溃,无法编译正确的闭包语法代码或生成非法字节码。
消极的一面是尼尔·加夫特的一些陈述:
自 0.15 草案以来已经将近三个月了,现在距离 openjdk7 功能之前的 TL(工具和语言)最终集成完成不到两周。如果您在规范和实现方面取得了进展,我们将非常感谢您与我们分享。如果没有,也许我们可以提供帮助。如果 Oracle 决定这个特性对 JDK7 不再重要,那也很高兴知道。无论发生什么,沉默都会发出错误的信息。
Neal Gafter 和 Jonathan Gibbons 之间的讨论:
很高兴看到这个,毛里齐奥!不幸的是,它迟到了一周,并且在错误的存储库中,无法包含在 jdk7 中。
我注意到没有一个测试显示函数类型的变量被转换为 SAM 类型。那里有什么计划? Jonathan Gibbons 的回应: 既然 jdk7 发布的功能列表和 jdk7 发布的时间表似乎不一致,为什么你总是假设时间表是正确的?Neal Gafter 的回答:因为我记得反复讨论过,功能集将根据他们相对于时间表的完成状态进行调整。
有些人甚至质疑整件事是否有意义,并建议改用另一种语言:
人们开始怀疑,为什么不直接迁移到 Scala ——为了围绕 lambdas 构建一个连贯的特性组合,还需要向 Java 添加更多内容。现在,这些延迟不仅影响了 ParallelArray 的用户,还影响了所有想要用 Java 构建整齐重构、可测试的软件的人。
似乎没有人提议在 Java => 中添加声明站点差异,这意味着
FunctionN<T, ...>
接口不会按照应有的方式进行子类型化。原语也没有专门化。(除了玩具类,Scala 的 @specialized 已被破坏,但至少它朝着正确的方向发展)没有 JVM 级别的识别对象是一个闭包,因此可以被消除,因为它可以与 Scala 的闭包消除(如果 HOF 也可以内联)。JVM 似乎添加了类似于不可避免的机器字访问每个多态调用站点,即使它们被认为是内联缓存而不是超态的,即使在循环内也是如此。如果使用任何形式的闭包而不是可以在 Scala 中使用@inline 的闭包来实现,我所看到的结果是玩具微基准测试(例如“对整数数组求和”)的速度大约降低了 2 倍。(即使在 Scala 中,大多数 HOF 都是虚拟的,因此不能内联。)我希望看到一种/鼓励/在每个 for 循环中使用闭包的语言中的可用内联。
结论
这只是对正在发生的整个问题的快速浏览,引用和陈述根本不是详尽无遗的。目前人们仍处于“Java 中真的可以实现闭包吗?如果可以,应该如何实现以及看起来如何?”的状态。
没有简单的“好吧,我们只是在周末为 Java 添加闭包”。由于一些设计错误的相互作用,比如可变参数作为数组,类型擦除......有些情况是行不通的。找出所有这些小问题并确定它们是否可以解决是相当困难的。
最后,可能会有一些惊喜。我不确定那个惊喜会是什么,但我想它会是:
- 闭包不会进入 Java 7 或
- Java 7 中的闭包将与 Java 5 中的泛型一样(有缺陷、复杂的东西,看起来它可能会起作用,但是一旦你把事情推得更远一点就会分解)
个人观点
我很久以前切换到 Scala。只要 Oracle 不对 JVM 做傻事,我就不管了。在 Java 语言的进化过程中犯了错误,部分原因是向后兼容。这给人们试图做出的每一次新改变都带来了额外的负担。
基本上:Java 可以工作,但该语言将不再进化。人们所做的每一次改变都会增加进行下一次改变的成本,使未来的改变越来越不可能。我不相信在 Java 7 之后 Java 语言会有任何变化,除了一些小的语法改进,比如项目 Coin。
在 lambda-dev 邮件列表上进行了大量与语法和透明度相关的辩论(特别关注阅读具有特定语法的柯里化函数有多难),并且有一些提案草案来自 Sun 的迭代,但我已经有一段时间没有在该列表中看到太多了。
最新消息是截至 2009 年 11 月下旬的 AFAIK,闭包将以某种形式出现在 Java 7 中。由于这是发布显着延迟的主要原因,因此他们似乎不太可能再次放弃它。
我现在正在参加一个发布会议,演讲者说 Java 8 即将关闭。