InfoQ

新闻

闭包与保持Java的感觉

作者 Geoffrey Wiseman译者 曹云飞 发布于 2007年12月24日 上午4时34分

社区
Java
主题
变更
标签
语言特性,
闭包(Closures)

在过去的几年中,关于将闭包作为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

5 条回复

回复

java的感觉 发表人 li Fangzhao 发表于 2007年12月24日 下午6时55分
范型不好吗? 发表人 Jimmy Shine 发表于 2007年12月24日 下午7时45分
Re: 范型不好吗? 发表人 cao yunfei 发表于 2007年12月24日 下午8时50分
比较欣赏 FCM 发表人 jiang yu 发表于 2007年12月24日 下午10时16分
符号代替文字 发表人 sai see 发表于 2007年12月25日 上午3时1分
  1. 返回顶部

    java的感觉

    2007年12月24日 下午6时55分 发表人 li Fangzhao

    一种纯粹的感觉,像以前被人所评论的,一如武当

  2. 返回顶部

    范型不好吗?

    2007年12月24日 下午7时45分 发表人 Jimmy Shine

    个人觉得范型挺好的,我看到至今还有许多程序员不知道如何从Collection中迭代对象,范型可以很好的帮助进行迭代。且保持了简洁的代码。
    闭包确实是一个很简洁的,但是很诡异的东西。就像是C/C++中的指针一样,用好了不错,用不好会有很多潜在的BUG,看你的掌握了。

  3. 返回顶部

    Re: 范型不好吗?

    2007年12月24日 下午8时50分 发表人 cao yunfei

    许多程序员不知道如何从Collection中迭代对象
    用for循环就可以迭代了吧,加上类型转型就可以,这里会出什么错误?

  4. 返回顶部

    比较欣赏 FCM

    2007年12月24日 下午10时16分 发表人 jiang yu

    java的范型确实比较难捉摸,
    因为擦拭法的实现带来了不伦不类的感觉.

    闭包吗,个人觉得还是有必要的.
    BGGA这个东西确实不地道,太复杂了.
    FCM比较不错,看了看主页参考了haskell,有点亲切感.
    CICE这个有是一个编译器魔法,当然了兼容性什么的肯定No.1啦,不过千万不要是下一个范型.

  5. 返回顶部

    符号代替文字

    2007年12月25日 上午3时1分 发表人 sai see

    闭包的精简感觉就是用符号代替了文字,没什么意义吧,这样oo的感觉似乎就不存在了,完全是在用脚本。

独家内容

剖析短迭代

敏捷教练Dave Nicolette提出:我们应该如何设定迭代长度?是要根据发布周期的时间么?使用短迭代又有哪些好处?

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

AtomServer:数据分发的发布动力(第二部分)

在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。

架构师(试刊第二期)

InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!

一种正规的性能调优方法:基于等待的调优

在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。

Java程序员ActionScript 3入门

通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。

浅谈如何创建Rails应用

本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。

Alexandru Popescu谈InfoQ.com网站架构

InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。