阅读更多

66顶
91踩

企业架构

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

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

寻找更好的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 条 请登录后发表评论
89 楼 elemark 2009-07-18 08:59
ouspec 写道
elemark 写道
ouspec 写道
elemark 写道
明明是翻译,还要标原创,标题党加剽客

不厚道啊,鄙视!


新闻频道的原创基本上都是翻译自国外的文章,文章一开始已经写的很清楚,原作者是谁,译者是谁,不存在剽窃问题,请注意你的用词,谢谢。

不好意思,小弟初来乍到,不懂规矩,原来未经原作者同意的翻译在这边可以标成原创的啦?不好意思呵呵
“文章一开始已经写的很清楚,原作者是谁,译者是谁,不存在剽窃问题”,这样子啊,不过比这个开始的更开始,文章的标题是标注了“原创”标记的,我没有看错吧?
另外咱们这边好像还有“翻译”标记的,不是么?呵呵
另外,ouspec你好,请问你是哪位啊?没有表明你的执法权的话,我向你讲的任何话,都不能作为你执法的依据的哦呵呵
“新闻频道的原创基本上都是翻译自国外的文章”???你能代表新闻频道?还是这只是你自己的观点?


我是javaeye的管理员之一,我已经解释了,新闻频道的原创代表自主翻译国外的技术文章和新闻,我们的新闻频道只有原创和非原创的分别,只有在博客中有详细分:原创,翻译,随笔,转载等不同的logo,由于新闻频道绝大部分的自主新闻都是翻译自国外的技术新闻,所以,只要是javaeye自主翻译或者发布的新闻,我们都标记为原创,如果你觉得是原创logo造成的误会,可以提示管理团队把这个logo改掉。我只是觉得你指出作者剽窃,这个用词过分,文章一开始就指出了原作者是谁,翻译是谁,而且在文章结尾,给出了详细的来源网站和来源地址,怎么会说作者剽窃呢?


早晨起来看到这个真开心!昨天81楼还不是这个呢呵呵
“所以,只要是javaeye自主翻译或者发布的新闻,我们都标记为原创,如果你觉得是原创logo造成的误会,可以提示管理团队把这个logo改掉。”--真实情况不是这样的,大部分新闻(包括翻译新闻)并没有标记“原创”。
管理员大人你好啊,原来新闻这边没有“翻译”标签的啊?那我现在提示好了,请把原创logo换掉。然后我再提示一下,新闻板块加上“翻译”标签吧。
我明白辛辛苦苦的翻译成果被人说成是剽窃的滋味不好受,但是既然文章的所有内容都出自原作者,咱们只是翻译而已,就加上“原创”标记,让上天告诉我这里头一点儿剽窃的成分都没有么?
整篇的翻译,顶多是个影印版啦,影印版能加原创标记么?
请注意,这个问题是因为加上了“原创”这个logo或者标记我才说他是剽客的,如果他没有这个标记或者logo,我的观点的出发点就没有了,我就不会说他是剽客了。谢谢
所以请管理员不要轻轻带过“原创”这个logo或者标记也就是我的观点的出发点的问题,加大笔墨在我的观点--剽客上头了。另外,这不是误会,这构成了事实。
你是管理员哈,javaeye首页有个版权说明的,所有javaeye的文章都是javaeye的版权,不许转载等等一堆。那请管理员换位思考,如果javaeye的一篇绝妙中文文章,在国内非常火,结果被其他语种国家某个网站翻译并贴到了自己的首页上,你能说那个网站有版权么?他的翻译经过javaeye的允许了么?如果翻译并且贴过去还标上原创,javaeye作何想啊?就算在文章的最后一行标上了“此文章来自javaeye”,因为翻译转载带来的点击量带来的商业盈利也已经构成了不是,后面的不用我说了吧?
88 楼 hampster 2009-07-18 05:37
java的长处是什么?搞清楚了就不会轻易的想离开。任何语言都有短处,针对它的短,你总能找到别人的长。
87 楼 kejianjun01 2009-07-17 18:50
谬论!java已经流行15年,等待的并不是死亡,而是更新!
86 楼 xiebiao110 2009-07-17 17:30
chandler 写道
   为什么总是拿一些段处来说呢?而且一些功能是模龄两可的事情。

下面那么多人都跟着认同的难道您们也没搞清楚这几个最基本的概念?
www.zszs.net 写道
我们就很难理解,变量test为什么是false:

    Intger a = new Integer(1024);

    Intger b = new Integer(1024);

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

看不下去了,出来说一句。

楼主先把下面几个名词的概念搞清楚再看上面的把!

“装箱”和“拆箱”

“引用类型”和“值类型”

最后说一句,下面那么多人都跟着认同的难道您们也没搞清楚这几个最基本的概念?

楼主应该比较一下人和克隆人的大小,不是让你比较数字1024和1024的大小
85 楼 superscorpio 2009-07-17 16:10
我想这些细节都能算什么重大的问题。

我觉得导致我离开java的最重要的原因可能就是:java语言不再规范,没有严格标准,不稳定。

现在这个倾向不是很明显吗?如果一个标准,大家都不去遵守它,这个标准存在的意义是什么?

java语言它是一种语言,不是一个产品,今天升级明天升级。语言天天在变化,这给“交流”带来了障碍!
84 楼 gstripe 2009-07-17 13:51
翻译其实也可以作为是原创的,原创翻译~
83 楼 xiaocheng882000 2009-07-17 13:15
哇,还在人在争论原不原创的字眼
82 楼 徐风子 2009-07-17 12:44
写得很好,特别是对java的缺点说得一针见血。

java是改大改动一次了,完全不兼容以前版本。不然就只有用jvm去孕育下一代语言了。
81 楼 yxbwzx 2009-07-17 11:09
干java 的民工太多了,整体水平被拉下了,这也可以成为一个离开java工作的理由
80 楼 ouspec 2009-07-17 10:44
elemark 写道
ouspec 写道
elemark 写道
明明是翻译,还要标原创,标题党加剽客

不厚道啊,鄙视!


新闻频道的原创基本上都是翻译自国外的文章,文章一开始已经写的很清楚,原作者是谁,译者是谁,不存在剽窃问题,请注意你的用词,谢谢。

不好意思,小弟初来乍到,不懂规矩,原来未经原作者同意的翻译在这边可以标成原创的啦?不好意思呵呵
“文章一开始已经写的很清楚,原作者是谁,译者是谁,不存在剽窃问题”,这样子啊,不过比这个开始的更开始,文章的标题是标注了“原创”标记的,我没有看错吧?
另外咱们这边好像还有“翻译”标记的,不是么?呵呵
另外,ouspec你好,请问你是哪位啊?没有表明你的执法权的话,我向你讲的任何话,都不能作为你执法的依据的哦呵呵
“新闻频道的原创基本上都是翻译自国外的文章”???你能代表新闻频道?还是这只是你自己的观点?


我是javaeye的管理员之一,我已经解释了,新闻频道的原创代表自主翻译国外的技术文章和新闻,我们的新闻频道只有原创和非原创的分别,只有在博客中有详细分:原创,翻译,随笔,转载等不同的logo,由于新闻频道绝大部分的自主新闻都是翻译自国外的技术新闻,所以,只要是javaeye自主翻译或者发布的新闻,我们都标记为原创,如果你觉得是原创logo造成的误会,可以提示管理团队把这个logo改掉。我只是觉得你指出作者剽窃,这个用词过分,文章一开始就指出了原作者是谁,翻译是谁,而且在文章结尾,给出了详细的来源网站和来源地址,怎么会说作者剽窃呢?
79 楼 elemark 2009-07-17 10:32
ouspec 写道
elemark 写道
明明是翻译,还要标原创,标题党加剽客

不厚道啊,鄙视!


新闻频道的原创基本上都是翻译自国外的文章,文章一开始已经写的很清楚,原作者是谁,译者是谁,不存在剽窃问题,请注意你的用词,谢谢。

不好意思,小弟初来乍到,不懂规矩,原来未经原作者同意的翻译在这边可以标成原创的啦?不好意思呵呵
“文章一开始已经写的很清楚,原作者是谁,译者是谁,不存在剽窃问题”,这样子啊,不过比这个开始的更开始,文章的标题是标注了“原创”标记的,我没有看错吧?
另外咱们这边好像还有“翻译”标记的,不是么?呵呵
另外,ouspec你好,请问你是哪位啊?没有表明你的执法权的话,我向你讲的任何话,都不能作为你执法的依据的哦呵呵
“新闻频道的原创基本上都是翻译自国外的文章”???你能代表新闻频道?还是这只是你自己的观点?
78 楼 ouspec 2009-07-17 10:07
elemark 写道
明明是翻译,还要标原创,标题党加剽客

不厚道啊,鄙视!


新闻频道的原创基本上都是翻译自国外的文章,文章一开始已经写的很清楚,原作者是谁,译者是谁,不存在剽窃问题,请注意你的用词,谢谢。
77 楼 elemark 2009-07-17 09:38
明明是翻译,还要标原创,标题党加剽客

不厚道啊,鄙视!
76 楼 dch1287 2009-07-17 09:22
对啊,java从设计之初就考虑的那么好,但是有些只是美好的愿望,但是sun公司不断改进才使java流行了14了,希望能够带来更大的革新!其实.NET也不错啊!
oaklet 写道
我们知道Python有个Python 3000计划,这个Python 3000相对之前的Python有大幅度的修改,并且不兼容之前的Python语法,这样可以完全摆脱因考虑向后兼容性而带来的不必要的负担.那么我们为什么也搞个JAVA 3000呢?它与之前的JAVA有着类似的语法,并且也能运行在JVM上,但语法上与原有JAVA语言不兼容.在JAVA 3K里面我们可以有真正的泛型,闭包,并且可以丢弃掉int那些基本类型.对于那些想继续使用原有JAVA的人来说继续用就是了,而程序员想学习新的JAVA语言也很容易.

您描述的就是Groovy啦
75 楼 xyh 2009-07-17 01:16
引用
2.缺少一等函数

翻译成“缺少函数直接量”似乎通顺点,见http://en.wikipedia.org/wiki/First-class_function



74 楼 joy2everyone 2009-07-17 00:09
lpp333 写道
    Intger a = new Integer(1024);
    Intger b = new Integer(1024);
    boolean test = a < b || a == b || a > b;

看到这个,我笑喷了~~!!!!



因为java自动包装对int转换为Integer是有大小限制,

如果是int和Integer比较,则没有限制,只要两者在数值大小相同即可

Integer对象之间比较,如下初始化:
Integer a = 1;
Integer b = 1;
当值在-128~127之间,则对象通过“==”返回true,反之为true

Integer对象之间比较,如下初始化:
Integer a = new Integer(1);
Integer a = new Integer(2);
无论数值多少,都将开辟不同的内存空间,所以都是返回false

这是我准备SCJP考试自己的学习笔记,希望跟各位前辈分享下,如果错误,请见谅 !


73 楼 goby2008 2009-07-16 20:43
无论是什么语言,能够带来经济效益,谁理你是什么语言,你说这个重要吗?
72 楼 aisjava 2009-07-16 20:22
同意作者,Java不会再引领下一个十年,它会逐步退到系统级。
看好JVM之上的其他语言,之前试用过Groovy,现在跟踪学习JavaFx。
JavaFx是Oracle看好的,第四代语言。其上所动用的财力、人力也不是其他语言可比的。

71 楼 linmxy 2009-07-16 19:50
JAVA7不上入闭包是大部分人的意愿的统一,等闭包真的对JAVA很重要时,自然会往JAVA里加。JAVA比起很多语言,要规范很多,因为它对于新特性的加入,考滤得比较慎重。
70 楼 yza0088 2009-07-16 19:49
同感,但个人看好动态语言

发表评论

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

相关推荐

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

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

  • ASP文件加密工具:Script Encoder使用方法

    编外:这个文章太不详细。大家可以参考前文:http://www.2cto.com/Article/200412/3354.html Script Encoder是微软公司提供的为ASP文件加密的命令行工具,目的是避免程序作者的源代码被空间商或Hacker窃取。Script Encoder只加密页面中的脚本部分,对于html的标签并不加密。   使用方法: 1,将需要加密的ASP文件cop...

  • Script Encoder:screnc.exe加密解密

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

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

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

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

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

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

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

  • Microsoft 脚本编码器Script Encoder

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

  • Script Encoder

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

  • ASP程序加密解密方法全面解析

    目前对ASP程序的加密方法主要有三种:脚本编码器(SRCENC.EXE)加密、组件加密、自编程序加密,下面我们就来展开介绍这三种加密方法……   如今,用ASP技术构建的网站随处可见。由于ASP脚本是在服务器上解释执行的(无法编译),因此你辛苦开发出来的ASP代码,很容易被人拷去任意修改,如何保护ASP源代码呢?这是每个ASP站长都会遇到的难题,网上求解这类问题的帖子非常多,下面我们就来谈谈

  • script加密解密工具下载

    网上下载的很多原代码,很多作者为了保护代码,将其中的script部分用微软的*.Encode工具进行加密。最近在网上找到一个script加密解密软件,很不错的。推荐给大家。可以进行批量加密、解密操作。下载地址:http://www.newbooks.com.cn/soft/encode.rar

  • 一片全面介绍Script Encoding加密的文章,很全面可惜是E文的(那位个哥们e文好翻译一下)

    2000年08月31日 09:55:00 Script Encoding with the Microsoft Script Engine Version 5.0 Andrew Clinick Tired of exposing your Web scripting code to prying eyes? With version 5.0 of the Microsoft Script

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

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

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

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

  • WindowsScript帮助、入门、工具手册

    JScript Microsoft 功能强大的脚本编写语言是专为 Internet 而设计的。JScript.NET 是 Microsoft ECMA 262 语言的下一代实施产品。与 ECMAScript Edition 4 一起开发的、JScript.NET 中的改进功能包括了准确编译的代码、类型与无类型的变量、类(内含继承、函数重载、属性访问器等等)、包、跨语言支持,以及对 .NET 框架的访问。 VBScript Microsoft Visual Basic Scripting Edition 为各种环境提供有效的脚本编写手段,包括 Microsoft Internet Explorer 中的 Web 客户端脚本编写及 Microsoft Internet Information Services 中的 Web 服务器端脚本编写。 脚本运行时 Dictionary 对象相当于 PERL 的关联数组。项可以是任意形式的数据,存储在数组中。每一个项与唯一的关键字相关联。关键字用于检索个别项,通常是一个整数或字符串,它可以是数组以外的任何内容。 FileSystemObject (FSO) 对象模型允许您使用熟悉的 object.method 语法以及一系列属性、方法和事件来处理文件夹和文件。 脚本 Encoder 是一种简单的命令行工具,它使脚本设计者能够对自己的最终脚本进行编码,这样 Web 主机和 Web 客户机就不能查看或修改它们的源代码。 Windows 脚本部件 Microsoft® Windows® 脚本部件为您提供了使用脚本语言,如 Microsoft® Visual Basic® Scripting Edition (VBScript) 和 Microsoft® JScript® 创建 COM 组件的简单方法。 Windows 脚本宿主 Microsoft Windows 脚本宿主 (WSH) 是一种工具,它允许您在基本操作系统(Windows 95 或 Windows NT 4.0.)内部运行 Visual Basic Scripting Edition 和 JScript。 Windows 脚本接口(英文) Microsoft Windows 脚本接口为应用程序引入了一种增强脚本和 OLE 自动化功能的新方法。

Global site tag (gtag.js) - Google Analytics