写点什么

闭包与保持 Java 的感觉

  • 2007-12-24
  • 本文字数:1773 字

    阅读完需:约 6 分钟

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

2007-12-24 04:34710
用户头像

发布了 47 篇内容, 共 91764 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

Libra白皮书解读

程序那些事

区块链 facebook 数字货币 libra

知乎Matisse图片库在Android10上拍照,预览问题

三爻

android

副业月赚 10 万的程序员是如何做销售的?

非著名程序员

程序员 独立开发者 程序人生 提升认知

架构师训练营作业(第二周)

王海

极客大学架构师训练营

钩陈/ 好中文作业:巴别塔

ZoomQuiet大妈

写作 大妈 是也乎 IMHO 蟒营®

原创 | TDD工具集:JUnit、AssertJ和Mockito (二十一)编写测试-测试模板

编程道与术

Java 编程 TDD 单元测试 JUNI

自由是不是随心所欲?

Neco.W

个人成长 自由 控制

如何基于 OAM 编写一个扩展 Trait?

钱王骞

云原生 k8s OAM

大中台模式下如何构建复杂业务核心状态机组件

奈学教育

中台

Zookeeper-Access Control List(ACL)

CoderLi

Java zookeeper 源码分析 后端

大中台模式下如何构建复杂业务核心状态机组件

古月木易

常用运筹学软件整理

张利东

面向对象的三个基本特征(要素)

彭阿三

三要素 三个基本特征 封装、继承、多态

Java 序列化

CoderLi

Java 程序员 后端 序列化

中电标协提出并归口:《政务APP评价指标》团体标准开启制订工作

博睿数据

App 标准化 中电标协 政务信息化 博睿宏远

Kafka零数据丢失的配置方案

奈学教育

kafka

2w字长文!手撸一套 Java 基础面试题

cxuan

Java 后端 Java25周年

原创下载 | TDD工具集原创开源代码免费下载!

编程道与术

Java 开源 TDD 下载 代码

华硕灵珑II笔记本电脑——自由work不设限

最新动态

架构师训练营学习总结——框架设计【第二周】

王海

极客大学架构师训练营

2020年5月云主机性能评测报告

博睿数据

云计算 服务器 公有云 机房 云主机

如何让程序员变得没朋友

四猿外

程序员 个人感悟 技术人生 经验分享

机器学习算法评估指标—2D语义分割

做技术BP的文案Gou

学习 2D 评估标准 语义分割

互金总结系列(1)--开篇

互金从业者X

游戏夜读 | 如何制作游戏?

game1night

ZooKeeper 数据模型:节点的特性与应用

CoderLi

zookeeper 源码分析 数据模型 节点

Zookeeper Watcher 流程分析(结合源码)

CoderLi

Java zookeeper 源码分析 后端 Watcher

Zookeeper 序列化

CoderLi

Java zookeeper 源码分析 后端

情绪管理 - ABC理论

石云升

情绪控制 ABC理论 费斯汀格法则

Java | 原来 serialVersionUID 的用处在这里

YoungZY

Java

月薪 3W 的 Apple 微信编辑是这么发文章的 |如何发类似 Apple 微信公众号的文章效果

陈东泽 EuryChen

CSS 微信 大前端 apple 微信公众号

闭包与保持Java的感觉_Java_Geoffrey Wiseman_InfoQ精选文章