写点什么

争论:Java 是否应该停止增加新特性

  • 2008-01-17
  • 本文字数:2323 字

    阅读完需:约 8 分钟

最近,关于 Java 平台的未来有许多辩论,有些人认为 Java 应该加入更多的特征,这样才能与 C#、Ruby 这样的语言竞争,另一些人认为应该保持 Java 的稳定,以免变的过于复杂以至于难以使用。 Bruce Eckel 认为应该彻底停止往 Java 中增加新特性,这引起了一场新的辩论。

在 Bruce Eckel 的博文中,他说如果Java 要保持主流地位,那么就需要停止进化。作为一种语言,Java 已经“过于嘈杂”了,代码有些过分啰嗦(例如 System.out.println())。Eckel 认为 Java 泛型增加了复杂性,这已经引起了人们的关注,他还说明了他看到的 Java 的一个关键问题:

我们对于复杂性的唯一控制手段是抽象:隐藏不需要暴露的部分(分治法(“divide and conquer”)是一个变种)。在 Java 中的悖论是,复杂性问题的一个关键方面被忽略了:没有认识到代码可读性是重要的问题。好像 IDE 会为你写代 码,如果那样的话即使代码过分复杂也不是问题了。[Joshua Bloch] 将关于复杂性的思想提升了一步。他说复杂 性不仅仅是指一个孤立的特定特征的复杂性,这种情况下复杂性通常是一目了然的。复杂性是指组合复杂性,这是当你将一个新特性与其他语言特性以任意可能的方式进行组合时所带来的复杂性。如果你没有从一开始就小心的设计,那么当你将一个新特性加入一种现存的语言中时,你无法控制该特性是怎样与其他现存特性进行 组合的。组合复杂性会产生恐怖的后果,特别是在加入了特性之后,这时再做任何事情都为时已晚。早餐结束后 Josh 说这类复杂性为 Java 的答疑解惑者提供 了丰富的素材,但是对于整个 Java 社区是有害的。

Eckel 认为他自己是一个“特性上瘾者”,总是思考语言在新特性方面的进化,但是现在他质疑如果一个特性不能被正确的实现,该特性是否应该被去掉 (例如 Java 的泛型)。Eckel 认为 C 和 C++ 都非常稳定,Java 也应该稳定而不是追逐新的语言特性或者试图跟随所有的市场冲动。有些人提出了打破 向后兼容性的想法,他们认为那些希望使用老特性的人们可以使用老版本的 Java 而不要升级到新版本。Eckel 对于不惜一切代价维护向后兼容性的风险做了 警告:

如果由于向后不兼容而不能正确的插入特性,我们在语言变化的时候会受到很大束缚,Java 现在的情形与 C++ 相同。C++ 经常因 为它的设计受到批评,从 C++ 标准委员会刚开始运转我就在其中工作,已经工作了 8 年,我看到了所有关于语言特性的辩论。这些语言特性不是变化无常的,而是 经过非常谨慎的而且深思熟虑的考量的结果。是向后兼容 C 语言产生了语言复杂性和困难性。一旦你在所有事情上都把自己与向后兼容绑定在一起,那么当你向语言 加入特性的时候必须做好语言被破坏的准备。如果 Java 不愿意打破向后兼容性,那么它就无法避免不打粮食的复杂性以及不完整的新特性实现。

Eckel 认为新的语言是放置主要新特性的正确场所,Scala 是“当前 Java 最好的退出策略”。他还认为 Java 唯一的出路是成为象 C 那样的工具语言,将来只应该清理并丰富现在不完整的库,把主要的语言变化(例如闭包)留给其他语言,而不是加入 Java 中。

Kevin Dangoor 同意 Eckel 的观点,他说在需要向后兼容性的语言中加入新的特性也是笨拙的,他还指出在这一领域 ECMAScript 与 Java 有同样的问题。Dangoor 还对于开发者始终要寻求新的、炫的特性来帮助项目的批判声音提出了质疑:

软件是思考的成果。其可锻性很强且新的思想很容易测试。通过互联网,新的思想和代码传播的很快很远,这是好事情。对于我来说,现 在开发软件比 5、10、15、20 年前要好的多。我看到许多闪光的事物飞过,而没有真正的使用过它们。但是我认为这些闪光的事物是非常重要的,其中包含了各种各样的思想,可以使用不同的工具将其应用于不同的场景。一些出自这些思想的实现成为了主流。一般来说,人们不会转而使用所有从其身边 飞过的闪光的事物。有些人会认真的尝试这些事物,他们可能会成为成功的拓荒者或者遭受失败的痛苦而转向其他解决方案。如果有足够的人喜欢该思想并且推动它 的发展,那么该思想会成为主流。Rails 是 2004 年闪光的新事物。毫无疑问,有一些早期的使用者遭受了痛苦,但是在那些岁月里,相对于使用其他工具的 人而言,更多的人因为使用 Rails 获得了非常高的生产率。不管最终有多少人接受了 Rails,事实是自 Rails 出现以后,它的很多思想对工作产生了显 著的影响。

Cay Horstmann 同样认为应该减少对 Java 语法的关注,增加对 Java 中痛苦之处的关注。Horstmann 援引了 C++,指出 Java 解决了 C++ 碰到的两个主要痛苦之处,内存管理和 GUI/ 数据库的访问。

然而,Java 现在需要解决它自己的痛苦之处:

  • 臃肿的代码 —— getter 和 setter 方法,匿名类形式的事件监听器,可以由编译器推断出来的长的类型声明。
  • Web 应用开发 —— 这很难,用复杂的而且动力不足的技术,例如 JSP 和 JSF 来开发 web 应用“就像用叉子来喝汤”。
  • 并发 —— “我不够聪明,不能满怀信心的说我编写的重要并发程序不会有死锁,不会有竞争条件。这就象我不够聪明,不能满怀信心的说我编写的重要 C++ 程序不会有内存泄露或内存破坏”

其他观点:

  • Phillip Calçado 认为Java 应该固定而不是继续扩展,但是不同意关于 Java 本身难以阅读的说法,他说在创建 Java 的时候,它比当时的语言,例如 C++ 易于阅读
  • Richard Relos 认为 大多数 Java 代码不使用新的语言特性,增加新的特性仅仅分散了开发者的注意力,破坏了逻辑形式。
  • Ian Cooper 探讨了C#的问题,他质疑 C#是否已经到达了收益递减的点,他同意主要新特性的去处应该是一个新语言
  • Giovani Salvador 担心如果 Java 不再增加新特性,它会过时,那么 Java 开发者会变成“恐龙”

你如何看待这个问题?

查看英文原文: Debate: Should the Java language stop adding new features?

2008-01-17 20:13681
用户头像

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

关注

评论

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

Discourse 的左侧边栏可以修改吗

HoneyMoose

xxl-job客户端架构流程

IT巅峰技术

react源码中的fiber架构

flyzz177

React

【React技术】JSX在企业级项目的运用and一个元素渲染demo

恒山其若陋兮

前端 11月月更

投入上百人、经历多次双 11,Flink 已经足够强大了吗?

Apache Flink

大数据 flink 实时计算

AI简报-重参数化RepVGG

AIWeker

深度学习 AI简报 11月月更

React源码分析5-commit

goClient1992

React

react hook 源码完全解读

flyzz177

React

【web 开发基础】PHP中的数组 (41)

迷彩

php 数据结构 11月月更 关联数组 索引数组

【React技术】开发过程中遇到State和生命周期方法在类里面的运用

恒山其若陋兮

前端 11月月更

湖仓一体电商项目(十五):实时统计商品及一级种类、二级种类访问排行业务需求和分层设计及流程图

Lansonli

湖仓一体电商项目 11月月更

湖仓一体电商项目(十六):业务实现之编写写入ODS层业务代码

Lansonli

湖仓一体电商项目 11月月更

一文了解 Go 标准库 strings 常用函数和方法

陈明勇

Go golang 字符串 11月月更 strings

【web 开发基础】PHP中使用array()语言结构新建数组(43)

迷彩

数据结构 array 11月月更 array() 新建数组

基于 Apache Flink Table Store 的全增量一体实时入湖

Apache Flink

大数据 flink 实时计算

Flink CDC 2.3 发布,持续优化性能,更多连接器支持增量快照,新增 Db2 支持

Apache Flink

大数据 flink 实时计算

python小知识-内置方法和属性应用:反射和单例

AIWeker

Python python小知识 11月月更

【web 开发基础】PHP中数组的遍历(45)

迷彩

数据结构 数组 foreach 11月月更 数组遍历

【web 开发基础】PHP中的预定义数组(46)

迷彩

php web开发基础 11月月更 预定义 超全局数组变量

react源码中的hooks

flyzz177

React

Python 操作mongodb库

度假的小鱼

mongodb 11月月更 Python 操作mongodb库

《2022开源大数据热力报告》发布,Flink 摘得「流处理」领域热力值 TOP1

Apache Flink

大数据 flink 实时计算

【web 开发基础】PHP中多维数组的声明 (44)

迷彩

数据结构 一维数组 二维数组 11月月更 多维数组

【web 开发基础】PHP 中数组的定义 (42)

迷彩

数据结构 数组 11月月更 数组的定义

“后 Hadoop 时代”,大数据从业者如何应对新技术趋势带来的挑战?

Apache Flink

大数据 flink 实时计算

Python 操作Mysql

度假的小鱼

pymysql 11月月更 Python操作Mysql

React源码分析6-hooks源码

goClient1992

React

Flink Forward Asia 2022 主论坛概览

Apache Flink

大数据 flink 实时计算

React源码分析4-深度理解diff算法

goClient1992

React

制造业要用龙头带动整条产业链发展,阿里云智能制造加速器首次集结

B Impact

Python 操作Excel(xlrd和XlsxWrite)

度假的小鱼

11月月更 Python xlrd读取Excel Python xlrd

争论:Java是否应该停止增加新特性_Java_Ryan Slobojan_InfoQ精选文章