寻找更好的Java替代语言的10大理由
作者:Mario Fusco
译者:liuu
别误解,其实在我的职业生涯中,我已经编写了无数的Java代码;而且,我仍然认为Java一门伟大的(程序)语言。相对于C++和Smalltack,Java已经有了很大的改进;但现在,即使是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这样提供这种机制的库,被如此多的主流框架,如Spring和Hibernate,采用的原因。此外,由于cglib通过运行时创建被代理类的子类来实现的,因此这些种方式有一个众所周知的限制——不能代理final类,比如String。
9、差劲的Switch...case语句:Java规定,switch...case只能选择int和enum(Java5开始)。这一点如果跟更现代的语言如Scala相比,看起来简直太弱了。
10、受检查异常(Checked exception):类似原生类型,受检查异常也已经成为Java的一个罪孽之源。它迫使程序员必须做下面两件极其糟糕讨厌的事情中的一个:让你的代码里充斥大量的、糟糕难读的、容易出错的try...catch语句,而这样做的最大意义,只是将捕获的异常,包装成运行时异常,然后再重新抛出;或者是让大量的抛出声明子句污染你的API,让接口缺少灵活性和可扩展性。
真正的问题是,这里我提到的这几大主要问题,唯一的解决办法,是要做一个痛苦的决择,定义一套新的语言规范,放下当前版本的向后兼容性。我猜他们永远也不会这么做,虽然我相信,如果编写一个能够自动转换旧Java源码的程序,让它们与假设的新版本兼容,并不是很困难。最后,这就是我决定开始寻找一个更好的JVM兼容语言的原因。
注:原文见TSS
http://www.theserverside.com/news/thread.tss?thread_id=55185,感觉作者说的还是有些道理的。
转载请注明出处:http://www.iteye.com/news/8909
分享到:
相关推荐
《Java语言程序设计 基础篇 第10版 梁勇 答案》是一本针对初学者和进阶者的重要参考资料,由知名Java教育专家梁勇编写。本书全面覆盖了Java语言的基础概念、语法和编程技巧,旨在帮助读者深入理解并掌握Java编程的...
学习Java编程语言需要有系统的学习计划和大量的实践经验,通过学习这些常用的Java学习资料,初学者可以更好地理解Java编程语言,提高自己的编程技能。但是,学习Java编程语言需要不斷实践和总结,初学者需要不断地...
《Java语言程序设计(一)》是自考Java专业的一门...通过编写小程序、参与项目开发,可以更好地消化理论知识,提高解决问题的能力。同时,不断关注Java的新特性和最佳实践,能够让你在这个快速发展的领域保持竞争力。
Java语言程序设计第十版的复习题答案是帮助学生巩固课堂知识的重要工具,尤其适用于那些希望通过解决实际问题来加深对Java编程语言理解的学习者。该资源包含对第十版教材中各个小节复习题的详尽解答,旨在提升学生的...
这些资源将有助于学生更好地掌握Java编程语言的知识和技能,并提高他们的编程技能和应用能力。同时,系统还将针对性地为学生提供学习计划和建议,以帮助他们更好地学习Java编程语言。 对于教师而言,Java语言考试...
Java 实现国际化是一种重要的...通过以上步骤和方法,我们可以有效地在Java和JSP应用程序中实现中英文语言的切换,为全球用户提供更友好的用户体验。在实际开发中,还需要结合项目需求和团队规范,灵活应用这些技术。
《Java 语言程序设计-进阶篇》是学习Java编程的高级教程,源自原书第10版,针对已经掌握了Java基础知识的读者,深入探讨了Java的高级特性和技术。这本书涵盖了多个关键知识点,旨在帮助开发者提升Java编程技能,...
为了使选泽《Java语言程序设计(第3版)》或《Java语言实用教程(第2版)》作为教材的读者能更快、更方便、更准确地学习Java语言,作者特别编写了这本《Java语言程序设计题解与上机指导》,作为这两本教材的配套参考书...
Java语言的语法与C++相似,但简化了许多复杂性,比如取消了指针操作,增加了垃圾回收机制,使得代码更安全、更易于管理。 在本书中,你将学习到以下关键知识点: 1. **基础语法**:包括变量声明、数据类型(如整型...
Java2Pas是一个实用工具,主要用于将Java编程语言编写的源代码转换为Pascal语言的等效代码。这个工具对于那些需要在两种语言之间迁移代码或者理解不同编程语言语法的开发者来说非常有价值。Java和Pascal虽然都是面向...
本资源收集了大量的Java面试题,旨在帮助读者熟悉Java编程语言以及相关的编程技术和知识点,从而在面试中更好地展现自己的能力和潜力。本资源主要包括Java基础知识、Java集合、多线程、IO操作、网络编程、数据库等...
计算机二级 Java language程序设计考试试题及答案 在计算机二级 Java 语言程序设计考试中,了解 Java 语言的基础...只有掌握了这些知识点,才能更好地理解和应用 Java 语言,以及更好地应对 Java 语言程序设计考试。
在Java编程语言中,实现大图查找小图的功能是一项实用的技术,常用于自动化测试、图像识别和游戏自动化等领域。这个功能通常被称为“图像匹配”或“屏幕找图”。本篇文章将详细探讨如何利用Java实现这一功能,以及...
《你必须知道的261个Java...通过阅读本书,读者不仅能够解决具体问题,还能通过问题的上下文更好地理解Java编程的深层次概念。因此,无论你是Java初学者还是有一定经验的开发者,这本书都是你学习Java语言的宝贵资源。
"C转Java工具"就是这样一个工具,它能够将大部分C语言的语法转化为等效的Java语法,使得C语言编写的程序能够在Java平台上运行或者进行进一步的Java优化。这个工具的出现,对于那些已经拥有大量C语言代码库但又希望...
这一点极大地促进了自然语言处理技术的普及和创新,也使得更多的研究者能够参与到自然语言处理的实践中来,推动了整个领域的进步。 支持中文是Lingpipe的另一个重要特色。随着中文互联网内容的爆炸式增长,中文处理...
Java大作业完整版,代码加文档,这是一份经过教师优评的项目,对于Java初学者来说,无疑是一个宝贵的学习资源。这份作业不仅包含了实际的编程代码,还附带了详细的文档,使得学习过程更加系统和全面。接下来,我们将...
标题和描述均提到了“OOP语言技术比较:Java,C++,Object Pascal”,这表明文章将对这三种面向对象编程(OOP)语言进行深入的技术对比分析。OOP是现代软件开发的核心概念之一,它通过封装、继承、多态等特性提供了...
Java语言的诞生是基于C++语言的,它继承了C++的优点,并且引入了更多的特性。Java语言的设计目标是提供一个“Write Once, Run Anywhere”的平台,使得程序员可以轻松地develop和deploy应用程序。 在Java语言中,类...