`

java的缺点,深有体会 现在

    博客分类:
  • java
 
阅读更多

别误解,其实在我的职业生涯中,我已经编写了无数的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,你却不能知道运行里该范型的确切类型。同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却不编译不了:

    List[] listsOfStrings = new List[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兼容语言的原因。

分享到:
评论

相关推荐

    java三种工厂模式文档+三个实例.rar

    通过阅读文档,你可以了解到如何设计和实现这些工厂模式,以及它们在不同场景下的优缺点。而实际的项目代码则会展示如何在真实世界的问题中运用这些模式,让你看到它们是如何解决具体问题的。 在进行学习时,建议...

    学习Java应该注意的问题.pdf

    但缺点在于缺少老师指点,对于不会的和重要的知识点无法有更深的体会和把握。因此,最好能将课堂和视频双方结合起来,进行学习。 2.1.3 了解底层机制:在学习的过程中,最好能够了解Java的底层机制,而不是仅仅停留...

    Java课程设计

    【Java课程设计】是关于构建一个基于Web的音乐光盘在线销售平台的实践项目,旨在提升学生的Java编程技能和Web应用程序开发能力。该平台需具备对音乐资源、会员管理以及购物流程的支持。 1. **系统功能**: - **...

    《Java项目实训》课程设计——计算器.docx

    - **讨论分析**:分析计算器设计的优缺点,探讨可能的改进方向和未来的发展趋势。 #### 五、参考文献 - **学术资源**:列出用于参考和研究的相关书籍、论文等资料。 - **在线资源**:列举在设计过程中参考过的网站...

    语言认知实验报告1

    - 编译器和解释器的设计对程序性能有显著影响,理解了编译执行和解释执行的优缺点。 - 实验过程中,对矩阵运算的优化和数据结构的选择有了新的认识,比如在处理大规模数据时,合理的数据结构和算法至关重要。 这个...

    时间片轮法进程调度操作系统实验报告.doc

    时间片轮法进程调度操作系统实验报告 时间片轮法进程调度是操作系统中的一种常用进程调度算法,它...时间片轮法进程调度算法是一种常用的进程调度算法,它可以提高 CPU 的利用率和系统的并发性,但是也存在一些缺点。

    java代码-日常练习9,三元表达式

    Java语言中的三元表达式,也称为条件运算符,是一种简洁的语法结构,常用于代替简单的if...else语句。这个日常练习9的核心就是深入理解并运用三元表达式。在Java中,三元表达式的格式是:`条件 ? 表达式1 : 表达式2`...

    CustomSSM:模仿SSM框架手写自己的框架,加深对框架的理解

    以及框架到底是什么如何去用此项目与SSM框架使用上大致相同,但SSM框架显然更加精细,我只是大致上实现了其中一些功能,有兴趣的同学可以下载下来,自己实现看看在使用过程中的缺点以及要求:在使用时需要使用jdk ...

    实验报告1

    实验者通过亲身体验,能深刻理解到每种编程语言的优缺点。例如,汇编语言虽然直接操控硬件,但编写复杂,而高级语言如Python和Java则提供了更高的抽象层次,简化了编程工作,但可能牺牲一些运行效率。Haskell作为...

    成绩管理系统及城市公交管理信息系统设计.docx

    - **理论意义**:探索基于Java编程语言和SQL数据库的成绩管理系统的设计与实现方法,有助于深化对软件工程理论的理解。 - **实践意义**:开发出的成绩管理系统可以应用于实际的教育教学环境中,提升管理效率,减轻...

    webService 之 xFire 实现流程

    - "Web+Services发布与调用(axis,xfire).doc":这份文档可能详细介绍了如何使用xFire和Axis这两个不同的Web服务框架发布和调用Web服务,对比两者的优缺点,帮助开发者选择适合的工具。 - "XFire-WebService.doc":...

    最小生成树Prim算法

    通过本次实验,我对Prim算法有了更深的理解。虽然在实验过程中遇到了些问题,但通过自己查阅资料和与同学商量,终于完成了实验。该算法的实现使我更加了解了图论的基本概念和算法设计的重要性。

    二十三种设计模式【PDF版】

    关于本站“设计模式” Java 提供了丰富的 API,同时又有强大的数据库系统作底层支持,那么我们的编程似乎变成了类似积木的简单"拼凑"和调用, 甚至有人提倡"蓝领程序员",这些都是对现代编程技术的不了解所至. 在...

    操作系统课程设计之进程调度

    通过实际操作,学生能够更加直观地感受到不同调度算法的优缺点,这对于未来从事相关领域的工作有着重要的意义。此外,这样的项目还有助于培养学生团队合作的精神,因为在分组完成任务的过程中,良好的沟通与协作是...

    CS1807-U201814745-朱槐志函数式编程1

    每个语言都有其独特的魅力和适用场景,理解它们的特性和优缺点对于拓宽编程视野非常有益。 通过实验,我不仅掌握了函数式编程的基本概念,如纯函数、柯里化、闭包等,还学会了如何利用这些概念解决实际问题。在面对...

    Leetcode-note:刷题笔记

    本笔记主要聚焦于Java语言,通过解决LeetCode上的问题,详细记录了菜鸟程序员在算法探索和学习过程中的心得与体会。 一、基础知识回顾 在开始刷题之前,我们需要确保对Java的基础语法有扎实的掌握。这包括但不限于...

    8C1C4B9B-3896-41E7-9B20-42BD9A2F6829.doc

    - **理解不同存储结构的优缺点:** 明确顺序表和链表在效率上的差异,以及在实际应用中的选择依据。 #### 实验要求 - 使用Java语言实现所有实验任务。 - 完成完整的实验报告,包含源代码及运行结果截图。 - 确保...

    数据结构实验指导(含分析,代码)

    1. 熟练掌握C++、Java或Python等至少一种编程语言,用于实现数据结构。 2. 深入理解实验指导书中给出的每个实验的背景和目标,确保代码实现与实验要求相符。 3. 对实验结果进行测试和验证,确保代码正确无误。 4. ...

    Design Patterns Explained(设计模式解析英文版)

    每个模式都配有详细的解释、应用场景以及优缺点分析。 - **模式之间的关系**:分析了不同设计模式之间的联系,以及它们如何相互配合来解决复杂的软件设计问题。 - **实践案例**:提供了大量的实践案例,通过C++和...

Global site tag (gtag.js) - Google Analytics