闭包与保持 Java 的感觉

  • Geoffrey Wiseman
  • 曹云飞

2007 年 12 月 24 日

话题:Java编程语言语言 & 开发文化 & 方法

在过去的几年中,关于将闭包作为 Java SE 7 的一部分或者在将来的某个未定的版本加入 Java 语言中,引起了广泛的讨论。对此已经有了一些提案(BGGA, CICE, FCM)并且达成了一致意见。一种思考目前可用提案的角度是考虑闭包对于 Java 语言的冲击:在经历了基本性的变化后 Java 是否可能依然保持“Java 的感觉”。Joshua Bloch 在 Javapolis 表达了他对于争论的观点 ,以及为什么他认为 CICE 是一种更合适的方式。

为了描述 Java 的感觉,Joshua Bloch 引用了 Gosling 在 1997 年 6 月 IEEE Computer 的一篇论文。

Java 是一种蓝领语言。它不是博士论文的内容而是一种工作语言。许多不同的程序员都觉得 Java 很熟悉,因为我们喜欢经过考验的事物。

他问道,“我们做的怎么样”,然后回答“不是非常好。” 通过引证了一篇 427 页的 FAQ 并且引用了一些用户的意见,他认为 Java 泛型是破坏了 Java 的感觉的一个变化,因为泛型带来了 Java 特征之间的指数级别的相互作用,并且得出了如何保持 Java 感觉的方法:

  • 我们不能再承受任何通配符
  • 要增加新的语言特性必须经过非常慎重的考虑
  • 对于概念层的增加越少越好
  • 新增的部分必须有高能效比

在简要的回顾了将闭包加入 Java 语言中的原因之后,Joshua Bloch 对于 BGGA 闭包提案的一些有争议的特征进行了讨论:函数类型(难以阅读的代码,鼓励“诡异的”编程风格,出人意料的相互作用);非局部 return、break 和 continue(令人费解的,阴险的 bug,变化的意义);无限制的访问非 final 的局部变量(另人费解,影响性能)以及 将库定义的控制构造器作为一个设计目标(不如特定构造器那么丰富,可能会慢一些,增加了复杂性)。

他还回顾了他提出的提案——简明实例创建方式(Concise Instance Creation Expressions——CICE)的要点:

  • 创建匿名类实例的简明语法
  • 用于自动资源管理的特定构造器

他对于那些希望在 Java 平台上看到更多语言变化的人提出了一个替代方案:

我们必须牢记这样的事实,对于 JVM 来说已经有一个很好编程语言提供了这么多功能,而且还添加了 Java 的互操作性:Scala。

最后,Joshua Bloch 描述了两种方式来给 Java 增加闭包特性:

  • 从原型得到更多的经验

    • 当我们达成了广泛地一致意见时,就开始在小范围内讨论 JSR

    • 这个过程也许需要几年

    • 遵守以前建立的先例

  • 在不久的将来开始在大范围内讨论 JSR

    • 必须允许提出任何关于闭包规范的观点

    • 第一个任务是回答两个大问题

  • 我们需要作出重大的决策!
  • 这对于 Java 平台的未来会有重大的影响。
  • 我们必须为此付出时间并且做正确的事情。
  • 我们绝不能进一步的伤害“Java 的感觉”。
一个 Javapolis 投票所得到的结果是多样的:30 个参与者投了 CICE 的票,BGGA/FCM+JCA 得到了 24 票,19 票给了不做变化。在一个反响热烈的Javalobby 上的一个讨论中, 反映很迅速而且是两极分化的,有些人认为 Joshua Bloch 在比较不同的提案的时候有明显的偏袒。另外一些人赞成这一观点,认为如果你需要这些特性,你应该使用 Scala。一些人觉得 BGGA 作为一个特 征会使得 Java 过于复杂,还有人认为复杂之处很少,不会影响日常工作。Carsten Saager喜欢 CICE。Stephen Colbourne仍然喜欢他的 FCM 提案

Neal Gafter 的回答简短而切中要害;他认为 BGGA 的语法在大多数真实世界的场景中会产生更简单的代码,他用 Doug Lea 的 fork-join 框架作为例子并让大家去 阅读他的关于非局部转移问题的解决方案。Bharath 的博文详细的描述了在评论中日益增长的一种观点:这种争论表明我们应该谨慎从事,不要在没有理解后果之前对 Java 做大的变动。Tim BrayMichael Kolling加入了“反对的”阵营,反对将闭包加入 Java。Tim Bray 这样说:

我的观点很简单:Java 工作的这么好是因为他符合 80/20 原则。照我的看法,Java 是史上最高调的、最干净的、符合 80/20 原则的技术。直 到泛型出现以前,对于 Java 中随后的 20%的尝试几乎是无害的,泛型是一个灾难;它让 Java 难以学习,难以理解,而且你不能避免泛型。

一件确定的事情是:我们还没有结束对于 Java 闭包的讨论。

查看英文原文Closures and Preserving the Feel of Java
译者简介: 曹云飞,西安交通大学计算机软件硕士。现就职于Ethos,热衷于计算机理论与应用技术的钻研,软件架构与敏捷开发,目前从事 consumer product 方面的工作。参与 InfoQ 中文站内容建设,请邮件至china-editorial[at]infoq.com
Java编程语言语言 & 开发文化 & 方法