产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

争论: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:13756
用户头像

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

关注

评论

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

如何让Java编译器帮你写代码

京东科技开发者

后端 编译器 java; 编译器原理 企业号 1 月 PK 榜

在Spring异步线程池中自动传递上下文,这样写轻松又方便

程序员拾山

Spring Boot #java

软件测试/测试开发 | 接口自动化测试中,文件上传该如何测试?

测试人

软件测试 自动化测试 接口测试 测试开发 文件上传

栉风沐雨 韧性前行 | 2022年九科大事件

九科Ninetech

RPA 超自动化 流程挖掘

谈谈enabled_shared_from_this

SkyFire

c++ 智能指针

智能合约DAPP项目系统开发技术逻辑(dEOM)

I8O28578624

流程的作用是服务于业务,所有不能被用来帮业务部门好好打粮食的流程,都不是好流程!

CTO技术共享

DAPP/去中心化系统开发流程解析方案(成熟理念)分析结果

I8O28578624

嘉为蓝鲸IT服务管理解决方案入选2022广东省政务服务创新解决方案

嘉为蓝鲸

自动化运维 嘉为蓝鲸 IT服务管理中心

Lattice - 模式级复用的能力定义

原力在线

架构 lattice 高可扩展

“零信任”下的防火墙策略管理

智维数据

大数据 防火墙 数据可视化 智能运维 运维安全

启科 QuTrunk+Runtime+QuSaaS+亚马逊云科技量子计算编程实战

亚马逊云科技 (Amazon Web Services)

Python 量子计算 Amazon EC2 Hero 专栏 Amazon Braket

Studio One6永久免费版本下载安装包

茶色酒

Studio One6

阿里巴巴最新版“Java性能优化实践文档来袭”把性能优化玩的出神入化

架构师之道

Java 编程 性能优化

设计模式之装饰者模式

程序员大彬

Java 设计模式

Databend 内幕大揭秘第二弹 - Data Source

Databend

NFT元宇宙链游游戏项目系统开发技术解析(Demo)

I8O28578624

深入理解跨域和最佳实践分享

Crazy Urus

面试 前端 HTTP 跨域

人人都在聊的云原生数据库Serverless到底是什么?

华为云开发者联盟

数据库 Serverless 云原生 华为云 GaussDB

CleanMyMac4.12.3中文版如何汉化免费?

茶色酒

CleanMyMac4.12.3

浅谈区块链项目开发技术(Solidity成熟语言)

I8O28578624

佛萨奇2.0系统开发解析逻辑教程方案(成熟技术)

I8O28578624

树与二叉树深度剖析(二)

C++后台开发

数据结构 算法 二叉树 红黑树 Linux服务器开发

30+亮眼指标,看看2022年嘉为蓝鲸的逆势创新之路!

嘉为蓝鲸

自动化运维 嘉为蓝鲸 2022大事件

Golang如何优雅接入多个远程配置中心?

王中阳Go

golang 高效工作 学习方法 后端 viper

比Postman更懂中国程序员,Apipost真香!

不想敲代码

接口测试 API 研发管理工具

流程的价值一,固化业务的最佳实践!

CTO技术共享

MySQL:如何给字符串加一个高效索引?

程序员拾山

MySQL

架构训练营第10期模块5作业

Geek_4db2d5

小令动态丨令牌云获中国金融科技·最佳新锐企业奖

令牌云数字身份

创新大赛 金融科技创新

什么是NFT链游项目游戏系统开发技术(Demo)采用Solidity 智能合约系统开发方案

I8O28578624

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