`

如何解决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>,你却不能知道运行里该范型的确切类型。同理,你也不能创建范型数组。这意味着,尽管下面的代码看起来很自然,但却不编译不了:
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语言程序设计 基础篇原书第10版part1

    本书以示例讲解解决问题的技巧,提供大量的程序清单,每章配有大量复习题和编程练习题,帮助读者掌握编程技术,并应用所学技术解决实际应用开发中遇到的问题。 基础篇主要介绍基本程序设计、语法结构、面向对象程序...

    JAVA程序设计与问题解决

    JAVA程序设计与问题解决基础篇和高级篇适合刚入门学习JAVA的童鞋

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

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

    解决SAT问题的JAVA代码

    解决SAT问题的JAVA代码,判断输入的范式是否存在可满足性。

    国家开放大学Java语言程序设计形考任务4

    Java语言是目前世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。国家开放大学的"Java语言程序设计"课程旨在让学生掌握Java的基本概念、语法和编程技巧。形考任务4是这个课程的一个重要组成部分,...

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

    本书以示例讲解解决问题的技巧,提供大量的程序清单,每章配有复习题和编程练习题,帮助读者掌握编程技术,并应用所学技术解决实际应用幵发中遇到的问题。 进阶篇主要介绍线性表、栈、队列、集合 、映射表、排序、...

    Java语言程序设计源代码

    Java语言程序设计是计算机科学领域中的一个重要主题,尤其对于初学者和有经验的开发者来说,理解和掌握Java编程语言是至关重要的。本资源包含了《Java语言程序设计》一书的源代码,这是一份宝贵的教育资源,可以帮助...

    国家开放大学Java语言程序设计形考任务3

    Java语言是目前广泛应用的编程语言,特别是在服务器端开发、Android应用开发等领域有着广泛的应用。国家开放大学的"Java语言程序设计"课程旨在帮助学生掌握Java编程基础,理解面向对象编程的概念,以及如何利用Java...

    约瑟夫问题java语言代码实现

    约瑟夫问题java语言代码实现 希望对需要的朋友有所帮助

    Java语言实用教程

    ### Java语言实用教程知识点梳理 #### 一、Java语言概览 - **程序与算法**: - **程序设计语言**:介绍程序设计语言的基本概念及其分类。 - **算法**:阐述算法的重要性,以及如何设计合理的算法来解决问题。 - ...

    java语言程序设计1-10章课后答案(代码)

    本资源“java语言程序设计1-10章课后答案(代码)”提供了《Java语言程序设计(基础篇 原书第10版)》前10章的全部课后习题解决方案,这将对学习Java编程的初学者来说极具价值。 1. **基础语法**: 第1-2章通常涵盖...

    java 语言的简单介绍

    Java 设计者对这个问题做过多种尝试,Java 虚拟机(JVM )就是试图解决这个问题的。他们的目标是“只要写一次程序,在任何地方、任何时间该程序永远都能运行”。 Java 语言还具有解释性和高性能。通过把程序编译为 ...

    从Java语言到XML语言的转换问题研究.pdf

    从 Java 语言到 XML 语言的转换问题研究.pdf ...从 Java 到 XML 转换可以解决当前 Java 到 XML 转换问题中存在的困难和限制,使得 Java 语言更加灵活和强大,并且可以更好地应用 XML 语言的优势。

    Java语言解决农夫过河问题

    问题描述:农夫要带鱼、狗、猫过河到对岸.,有一条船,只能坐一个人,农夫每次只能带一样动物过河,当农夫不在的时侯狗会咬猫,猫会吃鱼.,请问怎么顺序过呢?要求:编写程序,由程序来推出过河的... 用Java语言实现的

    java语言程序设计 10th by梁勇 编程练习题答案.zip

    这个名为"java语言程序设计 10th by梁勇 编程练习题答案.zip"的压缩包文件,为Java学习者提供了一份宝贵的资源,涵盖了从基础到高级的Java编程知识,有助于巩固理论学习,提高实践能力,对于个人的Java编程学习之旅...

    Java语言程序设计教学论文.doc

    与传统教学方式相比,案例教学方法更能充分发掘学生的创造潜能,培养学生学习 Java 语言的兴趣,提高学生解决实际问题的综合能力。在 Java 语言程序设计教学中实施案例教学,教学过程通过教学案例的实施过程来开展,...

    《JAVA语言程序设计》期末考试试题及答案_java期末考试_java_

    Java语言程序设计是计算机科学与技术专业的重要课程之一,它主要教授如何使用Java语言进行软件开发。本资料《JAVA语言程序设计》期末考试试题及答案提供了全面的学习和复习指南,帮助学生理解和掌握Java编程的核心...

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

    《Java语言程序设计:基础篇(原书第8版)》以示例讲解解决问题的技巧,提供大量的程序清单和相应的提示,每章配有大量复习题和编程练习题,帮助读者掌握编程技术,并应用所学的技术解决实际应用程序开发中遇到的问题。...

    JAVA语言程序设计(郎波主编)例题

    通过函数,程序员可以将大问题分解为小模块,提高代码的复用性和可读性。 面向对象编程是JAVA的一大特色。书中可能会涵盖类的创建、对象的实例化、继承、封装和多态等主题。学习者需要理解类的属性和方法,如何通过...

    JAVA语言程序设计课程教学大纲.doc

    《JAVA语言程序设计》课程教学大纲详细解析 一、课程基本信息 这门课程是针对计算机软件专业的必修课,课程代码未给出,...通过这门课程的学习,学生不仅可以掌握Java语言,还能形成良好的编程习惯和问题解决能力。

Global site tag (gtag.js) - Google Analytics