`
zhouxing
  • 浏览: 199048 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多

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

作者 Ryan Slobojan译者 曹云飞 发布于 2008年1月17日 下午8时13分

社区
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年前要好的多。我看到许多闪光的事物飞过,而没有真正的使用过它们。但是我认为这些闪光的事物是非常重要的,其中包含了各种各样的思想,可以使用不同的工具将其应用于不同的场景。一些出自这些思想的实现成为了主流。

一般来说,人们不会转而使用所有从其身边 飞过的闪光的事物。有些人会认真的尝试这些事物,他们可能会成为成功的拓荒者或者遭受失败的痛苦而转向其他解决方案。如果有足够的人喜欢该思想并且推动它 的发展,那么该思想会成为主流。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?

分享到:
评论

相关推荐

    JAVA面试题最全集

    1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。 2.字符串的操作: 写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出...

    java 面试题 总结

    新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把...

    超级有影响力霸气的Java面试题大全文档

    新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装:  封装...

    Java开发技术大全 电子版

    Java开发技术大全 电子版 第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释...

    FFCH4J:FFCH4J项目全称:FFmpeg命令处理器(原用名FFmpegComandHandler4java,FFmpeg命令行运行管理器)。不仅仅只是跨平台的ffmpeg命令执行、停止、查询功能的处理器,还是跨平台的命令行操作处理器

    java封装的提供ffmpeg命令执行、停止、查询功能的简单管理器 。 FFCH4j不仅仅只支持ffmpeg命令,还支持执行多平台的命令行指令,不管是执行linux命令还是windows的命令行都是手到擒来(注意:本项目并未屏蔽某些敏感...

    android Gallery实现异步加载网络图片 并只加载当前停止页面图.zip

    我们还使用了Java作为主要的编程语言,它是安卓应用开发的主流语言,具有丰富的库和框架,使得开发人员可以轻松实现各种功能和特性。 此外,我们的安卓项目源码还注重用户体验和界面设计。我们提供了一系列的界面...

    阿里巴巴编码规范 基础技能认证 考题分析(考题+答案).docx

    次版本号:保持相对兼容性,增加主要功能特性,影响范围极小的API不兼容修改。 D .修订号:保持完全兼容性,修复BUG、新增次要功能特性等。 多选 14.关于索引的使用,下列哪些说法是正确的:BCD A .查询语句 ...

    社区协作配置标准Tamaya.zip

    需要说明的是,尽管官方的JSR从未被JCP执行委员会所批准,但是标准化Java配置的努力却从未停止过。在本文中,我将会关注后续的工作以及这个初始项目的当前状态。配置标准为何如此重要?配置是一个通用的横切性关注点...

    EventService:观察者模式的轻量级实现+高级特性

    增加/减少优先级 停止 API & 示例 查看 实用程序 测试 使用 watch 模式运行测试(将启动 Chrome 和 Firefox): ./script/start-test-watch.sh 这将即时编译测试并在浏览器上执行。 页面上的调试模式允许通过...

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    第3章 文档的增加、修改及删除 3.1 插入并保存文档 3.1.1 插入的原理和作用 3.1.2 批量插入 3.2 删除文档 3.3 修改文档 3.3.1 整个文档的替换 3.3.2 使用修改器 3.3.3 upsert和save更新 ...

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    第3章 文档的增加、修改及删除 3.1 插入并保存文档 3.1.1 插入的原理和作用 3.1.2 批量插入 3.2 删除文档 3.3 修改文档 3.3.1 整个文档的替换 3.3.2 使用修改器 3.3.3 upsert和save更新 ...

    tomcat6、7、8、9, maven3.5

    版本3.2自3.1以来增加了几个新功能; 主要的努力是重构内部以提高性能和稳定性。3.2.1版本,如3.1.1,是一个安全补丁。版本3.2.2修复了大量的错误和所有已知的规范合规性问题。版本3.2.3是一个安全更新,关闭一个严重...

    jquery插件使用方法大全

    1.4重要新特性: ·常用方法的性能大幅提升:重写了大部分较早期的函数; ·更容易使用的设置函数(setter function):为所有对象新增了许多易用的设置函数; ·对Ajax的改进:引入了许多Ajax和JSON处理方面的更新...

    Elasticsearch 技术解析与实战.zip

    6 1.3.2 JSON介绍 10 1.4 安装配置 12 1.4.1 安装Java 12 1.4.2 安装Elasticsearch 12 1.4.3 配置 13 1.4.4 运行 15 1.4.5 停止 17 1.4.6 作为服务 17 1.4.7 版本升级 19 1.5 对外接口 21 1.5.1 API约定 22 1.5 .2 ...

    RED HAT LINUX 6大全

    5.7 GNU Window Maker窗口管理器特性 82 5.7.1 重要的文件 82 5.7.2 配置Window Maker 82 5.8 fvwm2窗口管理器 83 5.9 fvwm窗口管理器 83 5.10 twm窗口管理器 84 5.11 公共桌面环境特性 86 5.12 使用RPM安装Red Hat ...

    Oracle11g从入门到精通

    1.4 Oracle 11g的新特性 1.4.1 数据库管理部分 1.4.2 PL/SQL部分 1.4.3 其他部分 第2章 Oracle在Windows平台上的安装与配置 2.1 Oracle通用安装器 2.2 Oracle数据库软件的安装 2.3 Oracle数据库软件的卸载 ...

    Oracle11g从入门到精通2

    1.4 Oracle 11g的新特性 1.4.1 数据库管理部分 1.4.2 PL/SQL部分 1.4.3 其他部分 第2章 Oracle在Windows平台上的安装与配置 2.1 Oracle通用安装器 2.2 Oracle数据库软件的安装 2.3 Oracle数据库软件...

    疯狂Android讲义.part2

    1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 1.3 Android常用开发工具的用法 10 1.3.1 创建、删除和浏览AVD 10 1.3.2 使用Android模拟器...

    疯狂Android讲义.part1

    1.1.2 Android平台架构及特性 3 1.2 搭建Android开发环境 5 1.2.1 下载和安装Android SDK 5 1.2.2 安装Eclipse和ADT插件 7 1.3 Android常用开发工具的用法 10 1.3.1 创建、删除和浏览AVD 10 1.3.2 使用Android模拟器...

    PLSQLDeveloper下载

    集成调试器(要求Oracle 7.3.4或更高)——该调试器提供您所需要的全部特性:跳入(Step In)、跳过(Step Over)、跳出(Step Out)、异常时停止运行、断点、观察和设置变量、观察全部堆栈等。基本能够调试任何...

Global site tag (gtag.js) - Google Analytics