`

离开Java,寻找更佳语言的10大理由(更新)

    博客分类:
  • Java
阅读更多

注1:原文见TSS[http://www.theserverside.com/news/thread.tss?thread_id=55185],感觉作者说的还是有些道理的。原文标题:10 good reasons to look for something better than Java。

注2:翻译并不代表同意原作者的意见,这篇译文曾被推荐到JavaEye新闻,引起较大的争论。可能是本文的标题存在误导的嫌疑,其实如果细看了这篇文章,会发现作者并不是真的要离开Java领域,作者多次提到“不脱离JVM”、“寻找更好的JVM兼容语言”,意思是很明显的。与Java语言相比,JVM才是Java世界的真正基石,作者要表达的,是对现在Java语言的语法上的很多不满。另外,即将发布的Java7,将改善这里提到的诸多问题,见Java7中的语言改进

 

 

寻找更好的Java替代语言的10大理由

   作者:Mario Fusco  翻译:liuu 

 

    别误解,其实在我的职业生涯中,我已经编写了无数的Java代码;而且,我仍然认为Java一门伟大的(程序)语言。相对于C++SmalltackJava已经有了很大的改进;但现在,即使是Java,也已经开始感觉到了其15年的积重。

 

    事实上,在我的经历中,我总是不得不面对Java的设计和规范上的一些错误、缺陷和不足,这些东西,让我的Java程序员生活少有乐趣可言。现在全世界的Java程序员有数百万之众,Java写就的代码更达数亿行,要是我说Java在不久的将来死去,这还有些远。不管怎样,随着一些兼容JVM的语言出现(我最钟意Scala)后,这些问题变得越发不能容忍了,我开始想,是时候慢慢离开Java了(但并不脱离JVM)。具体说来,我认为Java语言的10大问题是:

 

   1、缺少闭包(closure):我想这个不需要解释了。函数式编程已经存在几十年了,但最近几年,它们获得了越来越多的关注,最主要的原因,是它可以自然地编写并行程序。我部分的同意Joshua Bloch强调在Java中引入闭包的问题需要再想一想(BGGA提议的方式真的很糟),至少闭包的缺失,使得在Java中做任何真正的函数式编程都是不可能的。

 

   2、缺少一等函数:这个问题与前一个有些关联,但我认为它更糟糕。在Java里,要达到类似效果的唯一方式,是使用著名的、丑陋悲惨的单方法匿名内部类,但这看上去的确是一个拙劣的方法。甚至在C#中,也通过代理机制,提供了一个更好的实现。

 

   3、原生类型(Primitive types):如果在Java中一切皆对象,那是多么完美啊,但他们偏偏不这样设计。因而,这一点导致了一些问题,比如,不能把一个int放到集合(Collection)里,这个在Java5中通过自动装箱特性得到了解决(下面会提到)。它也造成了传值与传引用上的困扰,原生类型数据是通过值传给方法的(复制一份拷贝,然后传给函数),而真正的对象是通过引用传递(译注:其实是复制对象引用地址再传递,因此应该也是传值方式,只是由于函数内部可通过这个对象地址访问对象,因此看起来好像是传引用)。

 

   4、自动装箱(Autoboxing)和自动拆箱(autounboxing):这个特性是为了解决因原生类型的存在所导致的问题,在Java5引入的。它允许静默地转换原生类型到相应的对象,但这常常导致其它的问题。比如Integer可以为null,但int不能,因此这时JVM只能抛出一个难以调试的空指针异常(NullPointerException)。此外,它还可能导致其它奇怪的行为,就像下面的例子,我们就很难理解,变量test为什么是false 

    Integer a = new Integer(1024);

    Integer b = new Integer(1024);

    boolean test = a < b || a == b || a > b; 

 

 

   5、缺少范型具类化:范型是Java5引入的一个很酷的特征,但是为了保持与旧版本Java的兼容性,导致缺失某些重要的特性,尤其是不能在运行时反省范型的类型。例如,你有一个方法,接受List<?>参数,如果传进来一个List<String>,你却不能知道运行时该范型的确切类型。同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却编译不了: 

    List<String>[] listsOfStrings = new List<String>[3];

 

 

   6、不可避免的范型警告:你有发现过自己陷入不可能去掉的关于范型的警告么?如果你像我一样大量使用范型,我打赌你碰到过。事实上,是这个问题的规模化症状,让他们认为需要引入一个特定的注解 (@SuppressWarnings("unchecked")) 来处理这种情况,我觉得,范型应该可能被设计的更好。

 

  7、不能传void给方法调用:我得承认,这种给方法传递void的需求,乍一看有些怪异。我喜欢DSL,当我实现自己的DSL库(lambdaj)的一个特定特性时,我不得不需要一个方法声明成这样的签名:void doSomething(Object parameter),这里为这个方法传进来的参数parameter,是另一个方法调用的结果,它唯一的目的,是注册调用(的对象)自身,以可以在以后执行它。让我吃惊的是,即使println方法返回void,看上去也并没有一个好理由,不允许我把代码写成这样:  

    doSomething(System.out.println("test"));

 

   8、没有原生的代理机制:代理是一种非常有效和应用广泛的模式,但Java提供的代理机制,只针对接口,而不是具体类。这是为什么象cglib这样提供这种机制的库,被如此多的主流框架,如SpringHibernate,采用的原因(译注:参见难经6:小心,SpringAOP声明式事务的一个缺陷,虽然Spring的AOP可以采用cglib来实现,但默认是采用Java本身的代理方式实现,为了兼容Java代理方式,造成其AOP抽象模型上存在一定不足,进而带来使用上的一些问题)。此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String

 

  9、差劲的switch...case语句Java规定,switch...case只能选择intenumJava5开始)。这一点如果跟更现代的语言如Scala相比,看起来简直太弱了。

 

  10、受检查异常(Checked exception):类似原生类型,受检查异常也已经成为Java的一个罪孽之源。它迫使程序员必须做下面两件极其糟糕讨厌的事情中的一个:让你的代码里充斥大量的、糟糕难读的、容易出错的try...catch语句,而这样做的最大意义,只是将捕获的异常,包装成运行时异常,然后再重新抛出;或者是让大量的抛出声明子句污染你的API,让接口缺少灵活性和可扩展性。

 

   真正的问题是,这里我提到的这几大主要问题,唯一的解决办法,是要做一个痛苦的决择,定义一套新的语言规范,放下当前版本的向后兼容性。我猜他们永远也不会这么做,虽然我相信,如果编写一个能够自动转换旧Java源码的程序,让它们与假设的新版本兼容,并不是很困难。最后,这就是我决定开始寻找一个更好的JVM兼容语言的原因。

 

 

 

 

                             

 

2
2
分享到:
评论

相关推荐

    Java语言程序设计.进阶篇.原书第10版.pdf 电子书下载高清

    Java语言程序设计.进阶篇.原书第10版.pdf java语言程序设计 进阶篇 本书是Java语言的经典教材 Java语言程序设计 进阶篇 原书第10篇版 正版内容下载,超高清,下载的亲们多多好评哦!

    java 实现国际化 中英文语言切换

    java实现国际化中英文语言切换 java语言切换JSP国际化 java实现国际化中英文语言切换 java语言切换JSP国际化

    Java语言程序设计

    本书将Java语言作为大学生的计算机程序设计入门语言,其特色是内容全面、深入浅出、辅助教材立体配套。不但详细介绍了Java语言本身,而且讨论了面向对象的设计思想和编程方法、UML建模语言、图形用户界面的编程方法...

    Java语言程序设计 基础篇 第10版 梁勇 答案

    Java语言程序设计基础篇第10版课后习题答案+完整源代码,直接导入eclipse即可运行

    Java语言程序设计 (原书第10版) (全本完整版)

    本书是Java语言的经典教材,多年来畅销不衰。本书全面整合了Java 8的特性,采用“基础优先,问题驱动”的教学方式,循序渐进地介绍了程序设计基础、解决问题的方法、面向对象程序设计、图形用户界面设计、异常处理...

    Java语言程序设计-基础篇(原书第8版)

    《Java语言程序设计:基础篇(原书第8版)》是Java语言的经典教材,中文版分为《Java语言程序设计基础篇》和《Java语言程序设计进阶篇》,主要介绍程序设计基础、面向对象程序设计、gui程序设计、算法和数据结构、高级...

    java语言程序设计(基础篇)原书第十版 习题答案(部分)

    java语言程序设计(基础篇)原书第十版 课后习题答案,自己一个行一行写的代码,不是标准答案,但每个答案都测试过。 从第9章到第13章。 包含的题目有: 第九章:9.1-9.5 9.7-9.9 9.13 第十章:10.1 10.4-10.7 第十...

    Java语言程序设计.进阶篇.原书第10版

    Java语言程序设计.进阶篇.原书第10版.pdf java语言程序设计 进阶篇 本书是Java语言的经典教材 Java语言程序设计 进阶篇 原书第10篇版 正版内容下载,超高清

    Java语言规范中文版(第三版)

    Java语言规范中文版(第三版) Java语言规范中文版(第三版)

    Java语言设计的文本编辑器

    用Java语言设计的文本编辑器,Java语言设计的文本编辑器

    java源码包---java 源码 大量 实例

    Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这款实例会对你有所帮助。 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM...

    自考java 04747《Java语言程序设计(一)》教材电子版

    自考java 自考java自考java自考java

    java迷宫自动生成与寻找路径

    java迷宫自动生成与寻找路径。 可以设置迷宫大小,最大为50,最小为5。 按make为自动绘制迷宫,find为寻找路径。 使用递归、随机方向的方式生成迷宫,位操作来设置上下左右的墙。 文件包括源码与jar运行程序。

    Java语言程序设计(源代码)

    Java语言程序设计(源代码)

    Java语言的科学与艺术(国外计算机科学经典教材)

     在本书中,斯坦福大学教授、著名的计算机科学教育领导者Eric S.Roberts着重强调了更适合于初学者的友好讲解方式,使用ACM Java库简化编程。本书简练清晰地介绍了传统CS1课程的内容,同时也包含了最近的Computing ...

    java开源包10

    ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载),浏览远程FTP服务器上的目录和文件,创建、删除、重命,移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括...

    Java 中文入门学习手册合集[chm版]

    第一章 Java语言的产生及其特点 第二章 Java程序开发与运行环境 第三章 Java程序设计基础 第四章 Java应用程序的基本框架 第五章 Java的类 第六章 Java图形用户接口 第七章 多线程 第八章 Java的"异常" 第九...

    04747《Java语言程序设计(一)》教材电子版.pdf

    04747《Java语言程序设计(一)》教材电子版.pdf

    Java程序设计教程[PDF]

    Java是一种编程语言,它具有简单、高效、健壮、安全、与平台无关、可移植性好和多线程等特点,是一种纯面向对象的、网络编程首选的语言。Java是一个平台,它支持从智能卡应用、手持式电子消费类产品应用、桌面应用到...

    c to java 转换工具

    该软件可以把c语言文件转换为java语言文件

Global site tag (gtag.js) - Google Analytics