BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

闭包与保持Java的感觉

| 作者 Geoffrey Wiseman 关注 0 他的粉丝 ,译者 曹云飞 关注 0 他的粉丝 发布于 2007年12月25日. 估计阅读时间: 6 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

java的感觉 by Fangzhao li

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

范型不好吗? by Shine Jimmy

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

Re: 范型不好吗? by 曹 云飞

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

比较欣赏 FCM by yu jiang

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

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

符号代替文字 by see sai

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

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

5 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT