闭包与保持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 Bray和Michael 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的感觉)