阅读更多

66顶
91踩

企业架构

翻译新闻 离开Java,寻找更佳语言的10大理由

2009-07-15 18:02 by 见习记者 ixu 评论(129) 有54486人浏览

寻找更好的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

    Intger a = new Integer(1024);

    Intger 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提供的代理机制,只针对接口,而不是具体类。这是为什么象cblib这样提供这种机制的库,被如此多的主流框架,如SpringHibernate,采用的原因。此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String

 

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

 

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

 

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

 

注:原文见TSS http://www.theserverside.com/news/thread.tss?thread_id=55185,感觉作者说的还是有些道理的。 

                             

 

来自: liuu.javaeye
66
91
评论 共 129 条 请登录后发表评论
49 楼 qdzheng 2009-07-16 10:58
没有一门语言能解决所有问题
48 楼 Unmi 2009-07-16 10:47
楼主认识的Java还不错,的确列出些java的不是来,那又有哪种语言是十全十美的。
要是拿着放大镜去审视某种语言,你将会更迷域。
取已所需吧,每一种语也都有取舍,什么都试图包容到,或许会影响到其他的方面。
想当初没有递归的 Fortran 也风靡那么久。
47 楼 ssuhvs 2009-07-16 10:33
java无敌天下
46 楼 ssuhvs 2009-07-16 10:32
45 楼 neora 2009-07-16 10:28
除了一些特别底层的工作外,无法代替C。在其他地方Java基本还算是万能的。
44 楼 xuby 2009-07-16 10:22
牛人不是已经讲了嘛,语言可以分为两种:
1、整天被人骂的语言;
2、没人用的语言。
43 楼 pritron 2009-07-16 10:20
Kaede 写道
pritron 写道
我们就很难理解,变量test为什么是false:
    Intger a = new Integer(1024);
    Intger b = new Integer(1024);
    boolean test = a < b || a == b || a > b;

当然错,这是比较a和b的内存地址而不是内容,如果你要比较内容请用
a.intValue()==b.intValue()

请不要说java不好如果你连java基础都不会.

呵呵 你误解楼主了。intValue这个是自动封箱、拆箱么?
呵呵,尚浅。

C#中泛型确实比Java做的到位!


这样请用
int a = new Integer(1024);
int b = new Integer(1024);
而不是
Integer a = new Integer(1024);
Integer b = new Integer(1024);
42 楼 Kaede 2009-07-16 10:07
pritron 写道
我们就很难理解,变量test为什么是false:
    Intger a = new Integer(1024);
    Intger b = new Integer(1024);
    boolean test = a < b || a == b || a > b;

当然错,这是比较a和b的内存地址而不是内容,如果你要比较内容请用
a.intValue()==b.intValue()

请不要说java不好如果你连java基础都不会.

呵呵 你误解楼主了。intValue这个是自动封箱、拆箱么?
呵呵,尚浅。

C#中泛型确实比Java做的到位!
41 楼 ray_linn 2009-07-16 10:01
综合楼主所述的语言就是C#啊
40 楼 spacefly 2009-07-16 09:57
想干掉java可能吗?
毕竟 java 应用广泛、开发者多、厂商支持力大,即使java有瑕疵它仍是一门非常优秀的语言;
java 当年也没干掉 c,c++,只是在互联网领域风光;
也许有一些语言会在新的领域风光,在新的领域把java堵在门外,但是在互联网等领域java的地位还是不容易被撼动的;
学习新的语言当然没问题,python,ruby,scala 也许都可以尝试学习和使用,但是无法把java否定掉;
39 楼 oaklet 2009-07-16 09:56
我们知道Python有个Python 3000计划,这个Python 3000相对之前的Python有大幅度的修改,并且不兼容之前的Python语法,这样可以完全摆脱因考虑向后兼容性而带来的不必要的负担.那么我们为什么也搞个JAVA 3000呢?它与之前的JAVA有着类似的语法,并且也能运行在JVM上,但语法上与原有JAVA语言不兼容.在JAVA 3K里面我们可以有真正的泛型,闭包,并且可以丢弃掉int那些基本类型.对于那些想继续使用原有JAVA的人来说继续用就是了,而程序员想学习新的JAVA语言也很容易.
38 楼 lucky16 2009-07-16 09:56
python  据我了解好像是有点实用!
但是你能说他比JAVA好吗????
不能!
关于你提出的    Boolean 那问题我也不解释。
下面的大牛们都解释了,
呵呵,适者生存吧!
37 楼 pritron 2009-07-16 09:55
我们就很难理解,变量test为什么是false:
    Intger a = new Integer(1024);
    Intger b = new Integer(1024);
    boolean test = a < b || a == b || a > b;

当然错,这是比较a和b的内存地址而不是内容,如果你要比较内容请用
a.intValue()==b.intValue()

请不要说java不好如果你连java基础都不会.
36 楼 swift.luo 2009-07-16 09:49
1. java本身是面向对象的语言,不支持闭包也无可厚非,闭包一样可以通过面向对象的方式来解决。
4. 我觉得也不是问题呀,这个是基础知识呀。
其余的毛病,跟lz一样觉得碰到之后比较蹩脚,感觉不爽。呵呵
35 楼 luoxlmail 2009-07-16 09:46
说得很好,但这毫无意义。
  如上,有的特性你是真的需要吗?
   还是的,一个语言在某些特定的领域有自己的专长
   

所以,对这种人,只想说一句:思想有多远,就给我滚多远。
34 楼 imlsq 2009-07-16 09:39
一个混球,标题党
33 楼 wushexu 2009-07-16 09:37
大部分都感受很深
32 楼 fangzhouxing 2009-07-16 09:35
用了1年多的Python,现在想再回到Java,感觉难适应了。
31 楼 wushexu 2009-07-16 09:32
我们就很难理解,变量test为什么是false:

    Intger a = new Integer(1024);

    Intger b = new Integer(1024);

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

这个test是false没错啊?大家说是不是?

a == b和 a > b都自动unbox了,但a == b没有,不是很怪异吗
30 楼 flysheet 2009-07-16 09:32
要设计一种满足大多数人的完美语言是不容易的,每一种语言在被设计的时候,都会幻想这门语言将来要多么美好(SmallTalk的初衷也是这样的,但它并没有成功),但实际上随着语言设计的进展,问题也会越多被暴露出来(新的需求),而这也才有给别的语言出现的机会,如果一种语言能够被设计的那么完美,那么我们还有必要学那么多语言,用那么多语言码?每一种语言都有它的不足和优势所在,所以这样文章,不应该带着批判的眼光来看待Java,而是正视它。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • asp代码--Script Encoder

    asp代码是也是经常使用的对于编程部来说,asp代码一般是明文,很少有加密的,MS有个工具Script Encoder可以加密,关于这方面的代码现在给大家一个参考。

  • script encoder对ASP脚本源代码进行加密工具

    script encoder对ASP脚本源代码进行加密

  • Script Encoder:screnc.exe加密解密

    从Microsoft那下载到这个小工具screnc.exe,这是命令行下的 Script Encoder(脚本加密)。它可以加密asp文件、html文件、js,vbs,sct,wsh文件,非常的方便。具体使用方法在命令行下输入 screnc /?即可查看,并且它自带有帮助说明书,我就不多介绍了。 下面介绍其简单的加密以及结合前面提到的一些解密方法来进行解密(以下的文件都保存在C:\下):...

  • 用MS script encode加密asp

    Active Server Page技术为应用开发商提供了基于脚本的直观、快速、高效的应用开发手段,极大地提高了开发的效果。但由于ASP脚本是采用明文(plain text)方式来编写的,所以应用开发商辛苦开发出来的ASP应用程序,一旦发布到运行环境中去后,就很难确保这些“源代码”不会被流传出去。这样就产生了如何有效地保护开发出来的ASP脚本源代码的需求。ASP运行机制ASP脚本是一系列按特定语法

  • 网页源文件加密工具 2.0

    名称:网页源文件加密工具 版本:2.0 作者:金海龙 开发平台:Delphi6+Win2000 性质:免费 Download: http://www.filefactory.com/file/a1d7f3h/n/JMNetPage.rar http://ishare.iask.sina.com.cn/f/6091795.html 功能:维护网页作者的权利,对Script标记中的内容加密 使任何人无法复制或篡改网页内容。 Google搜索:网页源文件加密工具 2.0 注意: 要想正常使用本软件,必须下载微软 公司的Script Encoder软件。下载并且使 用这个Script Encoder软件是完全免费的! 下载时间:15秒 (网速38.6KB) 请到微软的MSN网站下载 http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=e7877f67-c447-4873-b1b0-21f0626a6329 http://www.microsoft.com/downloads/ 申明:在本软件发布的时候,绝对不包含微软的screnc.exe文件! 用户必须到微软的网站上面下载该软件(Script Encoder)。 下载完成后,打开“sce10en.exe”安装该软件,安装完毕后, 把screnc.exe复制到JMNetPage.exe所在目录下。 源代码:你可以到如下网站下载源代码: http://www.filefactory.com/file/a1d7f69/n/JMNetPageCodes.rar http://ishare.iask.sina.com.cn/f/6091779.html 我经常制作高中数理化课件,喜欢用Delphi开发绘图软件。 我的文章,如果你觉得很好,那么别忘了我的主页网址、博客名称。 你可以通过任意一家搜索网站找到我,搜索课件的名字加我的姓名, 就能找到我。

  • 加密你的ASP页面——Script Encoder初探(转)

    一、概述   一直以来,ASP技术受到了越来越多朋友的喜爱,使用ASP从事WEB开发的人也越来越多。ASP一个非常明显的特征是页面在服务器端经过处理之后发送到浏览器中的内容为标准的HTML格式,这样有效的保护了页面程序的原代码不...

  • asp代码加密解密工具Microsoft 脚本编码器Script Encoder

    ASP代码加密解密工具,脚本编码器是一种简单的命令行工具,它使脚本设计者可以对最终的脚本进行编码,从而使 Web 主机和 Web 客户不能查看或修改它们的源代码。

  • 加密你的ASP页面——Script Encoder

    一、概述    一直以来,ASP技术受到了越来越多朋友的喜爱,使用ASP从事WEB开发的人也越来越多。ASP一个非常明显的特征是页面在服务器端经过处理之后发送到浏览器中的内容为标准的HTML格式,这样有效的保护了页面程序的原代码不被客户端轻易获取(当然MS的BUG不断那是另一回事了。^_^)。但是另一个普遍存在的问题是: 由于ASP页面是纯文本的形式存放,在服务器端可以轻易看到全部编程逻辑。这样给

  • 加密你的ASP页面—Script Encoder初探

    一、概述 一直以来,ASP技术受到了越来越多朋友的喜爱,使用ASP从事WEB开发的人也越来越多。ASP一个非常明显的特征是页面在服务器端经过处理之后发送到浏览器中的内容为标准的HTML格式,这样有效的保护了页面程序的原代码不被客户端轻易获取(当然MS的BUG不断那是另一回事了。^_^)。但是另一个普遍存在的问题是:由于ASP页面是纯文本的形式存放,在服务器端可以轻易看到全部编程逻辑。这样给ASP

  • Script Encoder

    Script Encoder 是一个简单的命令行工具,脚本设计者可使用此工具对他们的最终脚本进行编码,从而使 Web 主机和 Web 客户端无法查看或更改其源代码。注意,这种编码只能防止对您代码的一般性浏览,而无法防止专业黑客查看您的代码和实现方式。

  • 关于使用微软的Script Encoder 加密JavaScript代码出错的研究!

    最近一直用Script Encoder加密一段JavaScript程序,一直还不错! 突然有一天,报错了! 类似“Scripting   encoder   object   ( "Scripting.Encoder ")   failed。。。。 本来以为是JavaScript程序出错了, 反复试,还是不行!  好在G还有一个虚拟机, 打开,可以正常加密了。 后来嫌虚拟机上网麻烦, 下了一

  • Microsoft Script Encoder解密代码,oask加密文件解密

    Microsoft Script Encoder解密代码,oask加密文件解密 oask中有几个文件被加了密,找了几天终于找了完整的解密程序,在这里共享给大家 可完全解密文件oask_Main.asp,oask_qfunc.asp,oask_function.asp C#版的Microsoft Script Encoder解密代码 ...

Global site tag (gtag.js) - Google Analytics