争论:Java是否应该停止增加新特性
最近,关于Java平台的未来有许多辩论,有些人认为Java应该加入更多的特征,这样才能与C#、Ruby这样的语言竞争,另一些人认为应该保持Java的稳定,以免变的过于复杂以至于难以使用。Bruce Eckel认为应该彻底停止往Java中增加新特性,这引起了一场新的辩论
最近,关于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年前要好的多。我看到许多闪光的事物飞过,而没有真正的使用过它们。但是我认为这些闪光的事物是非常重要的,其中包含了各种各样的思想,可以使用不同的工具将其应用于不同的场景。一些出自这些思想的实现成为了主流。
- 本文关键词:

