近日 Mark Reinhold 在 Devoxx 的演讲中宣布 JDK 7 将增加闭包特性。由于添加了这个饱受 争议的特性,JDK 7 的发布时间将推迟至明年9 月左右。
Project Coin (旨在对 Java 7 进行小幅度的语言改进)的首席工程师 Joseph D. Darcy 已经确认语言的下一版本将增加某些“轻量级”的闭包:
… JDK 7 将增加闭包特性,增加的闭包要比 BGGA(即 Closures for the Java Programming Language,译者注)所提出的闭包更小巧,因此 JDK 7 的发布时间将推迟至明年 9 月左右:
Alex Miller 也参加了此次大会,他指出尽管过去社区已经给出了 3 个不同的提案,但 Sun 对于闭包的态度还是很消极:
我真的是无语了。这几年 Sun 总强调大家并没有就闭包这个问题达成共识,也延误了成立闭包 JSR 或专家组的时机,但实际情况却是社区已经给出了 3 个提案,每个提案都有相应的原型。
就在 Mark Reinhold 宣布这个消息不久,Neal Gafter(已有的 3 个闭包提案中 BGGA 提案的发起人之一,BGGA 其实就是 4 位发起者名字的首字母缩写,他们是 Bracha、Gafter、Gosling 和 von der Ahé)就发布了一个“简化的提案”:
该提案有如下变化之处: - 将控制调用(control invocation)语法移到另一个单独的规范中。
- 将术语闭包字面量(closure literal)替换为 lambda 表达式(lambda expression)。
- 我们检查了 lambda 表达式的语法,从 Clang 借鉴了一些精华。现在有两种形式的 lambda 表达式:expression lambda 拥有控制表达式,而 statement lambda 拥有控制语句。
- 将术语闭包对象(closure object)替换为函数对象(function object)。
- 将术语闭包变换(closure conversion)替换为 lambda 变换(lambda conversion),而控制调用语法将拥有一个单独的块变换(block conversion)。
- 为 return 语句增加新的语义:现在可以从 statement lambda 中返回了。
- 将 java.lang.Unreachable 改为 java.lang.Nothing,这一点借鉴了 Scala 。
- 移除对类型名 null 的支持。之前的版本在没有异常抛出时将 null 作为一个异常类型的占位符。现在,类型 Nothing 可以满足这个要求。
- 受限制检查。受限制(restricted)与不限制(unrestricted)的函数类型与闭包概念已经被移除了。现在所有的 lambda 表达式都是受限制的。我们可以通过控制调用语法将此前规范中的不限制闭包传递给方法。
- 增加方法引用支持:我们通过一个新引入的符号#将对方法的引用当作函数看待。该语法来源于 javadoc 中的交叉引用和 FCM 提案。
JDK 7 这种突然间的变化令 Fabrizio Giudici 等很多人对决策的过程表示怀疑:
我不想谈论这么做好不好(你知道在我听说该提案既不是 BGGA,也不是 CICE,而是一个新提案时我就觉得这不是一件好事)。我只是惊诧于仅仅几周后 Java 7 就与 Project Coin(知名的最终 5 提案)达成了一致,某些人几乎是瞬间就改变了主意。这到底是怎样的一个决策过程呢? 啊哈,我知道了——他们一定是投硬币决定的,现在我终于知道 Project Coin 项目名字的来历了。我担心 Java 7 会变成最混乱的一个 Java 版本——如果你想干掉 Java 的话这么做倒是不错(因为现在大家的争论点还不算太多,比如 Oracle 的收购或是关于 Jigsaw/OSGi 的争论)。
与此类似,Geertjan Wielenga 也觉得增加闭包这个决定太出人意料了:
如果没人想问决策的过程是怎样的,为何得出这个结论的话,那这绝对是个好消息,或许还是最好的消息呢。首先,我们拥有一堆提案,但根本没人看。其次,突然间我们就拥有了“简单闭包”(我想知道是否现有的所有提案都可以叫做“复杂闭包”呢。难道简单就是闭包的全部么?)。好吧,闭包看起来会很简单,没有非局部的 return(non-local return)、没有控制语句、无法访问非 final 变量。我还是想问一下,到底是如何得出这个决定的?
Cay Horstmann针对这个新的BGGA 提案给出了几个用例,与 FCM 提案何其相似:
我们真的不知道 Sun 到底想搞什么。之前我粗略地分析了一下 BGGA 0.6a 提案,总体上来说与现在的 BGGA 差不多。没人反对 BGGA 与 FCM 的相似性。没有非局部的 return、用于 lambda 的#。由于需要在捕获前用 @Shared 注解突变变量(mutated variable),人们在编写之前可能需要考虑再三。
复制代码
foreach(@Shared String v : values) funcs.add( #() => v);
Alex Miller 提到 JDK 发布的延期可能会让其他特性有机会加到最终的发布中,比如 ParallelArray 程序库,它为映射、过滤以及 Java 对象数组的裁剪提供了一套函数风格的 API:
我在 QCon 上与 Bob Lee 聊了一会,他觉得 JDK 7 的延期有可能会将 ParallelArray 纳入进来并使用新的闭包支持。
大家可以在 InfoQ 上找到关于闭包与 JDK 7 的更多信息!
请阅读本文的各位读者参加 InfoQ 的小调查。
查看英文原文: JDK 7 Unexpectedly Gets “Simple” Closures, but is Pushed Back to End of 2010
评论