`
mooniscrazy
  • 浏览: 2943 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

java语言的缺陷

阅读更多
从本质上说,java并没有什么缺陷,所有的语言都不过是一种工具而已。
但是,作为一种工具,自然希望它越方便越好。工具是给人用的。工具的不同,决定了能做出东西的质量。
与c#相比,java语言本身有两个地方,是有待改进的。比较严重的不足。
第一,没有轻量级的方法的支持,没有在语言层做出对event的支持。
系统组件之间耦合,本质上,还是方法调用。这种调用有两种形式,一种是A去调用B的方法,另外一种,就是A传递一个函数指针给B,让B去调用。后一种,就是回调函数。有些开发语言中,把回调函数称为事件。
java语言,对回调的支持,有明显的不足。
java是通过一个单方法的接口,来实现事件这种设计需求。为了实现多播,需要用一个集合类来装载这个接口的所有调用者。这个集合类要实现addListener,removeListener等方法。
而c#对此定义了专门的语法,叫做delegate和event。event就是delegate,只是它专门用来做事件的用途。
从本质上来说,这二者其实没有什么不同。只不过是c#的一个语法糖而已。
然而,因为这个语法糖,c#实现事件这种设计需求,只需要两行代码。而java,用20行还不一定能搞定。
有时候,懒惰的聪明人想到办法来解决这个问题,就是在java类中调用一个抽象方法,这样,可以实现单播的回调。这个类的使用者,继承这个类,实现抽象方法,这样就等于变相实现了事件。然而,这样做的问题,是不正确的使用了继承。同时,从使用者的角度看来,如果不去看基类的源码或者文档,很难发现这个方法里面是有玄机的。也就是说,它影响了架构,并且可读性不好。
c#的delegate,还有一个附加的功能,就是异步调用。这个功能,实在是太方便了。对一些通讯方面的项目,异步调用经常是必须。传统的方法,需要用多线程来实现。为了提高性能,就要搞线程池,还要考虑调用队列不能无限制的增加,必要的时候,让线程阻塞,整个框架是相当复杂的。然而,C#在语言层,把这一切都做好了。这对通讯方面的项目来说,实在是太方便了。

Java的第二点不足,是缺少p/invoke这种机制,让java程序可以调用系统本地的api。或者说,让java可以调用c函数。jni这方面是不完善的。除了内存复制降低了效率以外,它还使项目开发人员必须使用其他开发语言。而且,对于指针这种东西,无法复制,所以限制了很多功能的使用。的确,这种方法看上去不美,可是它很实用。因为没有纯粹的java操作系统,所以有时候必须调用操作系统的功能。
第三,还有java没有property这种语法,用getter和setter来代替属性,使代码看起来不美观。既然它是一种规则,那就该在语法中定义。这并不改变虚拟机的实现,本来是没有多大难度的东西。

从这几点来看,可以发现java和c#在设计思想上的差异。java是理想主义,而c#是实用主义。
然而,作为程序员,需要的是实用主义。能解决问题,才是最重要的。再难看的招式,只要能杀敌就是好招式。这恐怕就是java在语言发展上落后于c#的原因。
直到今天,java语言的开发者,思路仍然没有改变过来。这是令人十分厌恶的。程序员需要一个解决问题的工具,不需要高谈阔论的理论。事实证明,大公司也经常忽悠人。还是来现实的比较好。怎样才能把java改善得象c#一样快捷易用。


3
6
分享到:
评论
4 楼 mooniscrazy 2008-05-04  
没有这样的事情。.net framework是兼容以前版本的。你对c#的了解太少。
3 楼 qubic 2008-05-02  
两年前从c#转向java,楼主说的那些缺陷还能接受。之所以放弃是c#是因为微软经常在版本升级的时候删除或直接修改api,造成低版本写的程序在高版本中无法运行的情况,即没有做到向后兼容,这一点java做的比较好,一般把不推荐的方法标记deprecated
2 楼 mooniscrazy 2008-03-11  
但是java是工业化语言,要对它的客户负责人。提高客户的工作效率,是它分内的工作。
我们作为专业的软件开发者,也应该考虑客户利益。为客户选择成本最低的方案,才是合乎商业道德的。
降低开发成本,应该成为java设计者的目标。好看,但是不能解决问题与解决问题但是不好看相比,还是后者来得实在。
很多问题,其实是设计者的指导方针的问题,而不是技术问题。


1 楼 ShiningRay 2008-03-08  
相对于很多函数式编程语言来说,java还不是那么地理想主义
还有一些如brainf*ck,lambdak之类的语言

相关推荐

    软件测试实验报告含四个实验

    实验内容:C++语言、Java语言缺陷模式测试 二.实验要求:给出测试用例和测试结果 实验四 系统测试 一.实验内容:数据库应用系统性能测试 二.实验要求:给出响应时间、吞吐量测试用例和结果 以上代码均可运行

    Java缺陷检查系统源码.zip

    Java缺陷检查系统源码.zip

    基于Github的Java程序缺陷自动修复

    内容概要:通过带着读者设计并实现了一个基于 Github 的 Java 程序缺陷修复原型系统 VulRepair。并且为了验证 VulRepair 的缺陷修复效果,还设计并实现了一组评估对比实验,从多个角度评估验证本文提出的缺陷修复...

    Java线程模型缺陷

    关于 Java 线程编程的大多数书籍都长篇累牍地指出了 Java 线程模型的缺陷,并提供了解决这些问题的急救包(Band-Aid/邦迪创可贴)类库。我称这些类为急救包,是因为它们所能解决的问题本应是由 Java 语言本身语法所...

    java解惑(+Java 解惑你知多少)

    本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,...—— GUY STEELE,Sun学者以及Java语言规范的合著者 “我笑了,我叫起来了,我赞赏地猛举起了我的手” ——TIM PEIERLS,LLC的主席和前成员,JSR166专家组成员

    Java安全编码标准

    不仅从语言角度系统而详细地阐述java安全编码的要素、标准、规范和最佳实践,而且从架构设计的角度分析了java api存在的设计缺陷和可能存在的安全风险,以及应对的策略和措施。可以将本书作为java安全方面的工具书,...

    java谜题解惑 中文chm

    本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上...

    Java解惑.rar

    Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...

    JSP缺陷问题(bug)管理系统myeclipse开发sql数据库BS模式java编程MVC结构

    一、源码特点 ... 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发。 3、数据库文件名是jspsbug.sql ,系统名称bug 4、系统首页地址:http://127.0.0.1:8080/bug/login.jsp

    Java五子棋游戏分布式系统

    自己采用面向对象方法和Java语言开发一个玩五子棋游戏的分布式系统,不同的玩家可以通过Internet在任何不同的机器上玩该游戏,并支持聊天。虽然功能也不是很齐全,比如暂不支持注册、记录玩家信息及声音的功能,而且UI...

    Javascript简体中文JAVA教程

    JavaScript是一种基于对象(Object)和事件驱动(Event Driven)并具有安全性能的脚本语言。使用它的目的是与HTML超文本标记语言、Java 脚本语言(Java小程序...它的出现弥补了HTML语言的缺陷,它是Java与HTML折衷的选择。

    Java安全编码标准_PDF电子书下载 带索引书签目录_完整版

    不仅从语言角度系统而详细地阐述java安全编码的要素、标准、规范和最佳实践,而且从架构设计的角度分析了java api存在的设计缺陷和可能存在的安全风险,以及应对的策略和措施。可以将本书作为java安全方面的工具书,...

    JAVA程序设计与问题解决基础篇中文完整版.pdf

    本书是国外高校采用率很高的Java程序设计经典教材。书中以Java基础知识为主,包括基本类型、字符串、控制流、类...本书适合作为高等院校计算机专业本科生或研究生Java语言程序设计课程的教材,也适合相关技术人员参考。

    Java线程/内存模型的缺陷和增强

    北京 Java在语言层次上实现了对线程的支持。它提供了Thread/Runnable/ThreadGroup等一系列封装的类和接口,让程序员可以高效的开发Java多线程应用。为了实现同步,Java...而且Java语言最大的特点就是废除了指针,把

    java毕业设计之软件缺陷管理系统(ssm前后端完整源码).zip

    1、管理员端 (1)管理员登录:管理员进入软件缺陷管理系统进行各类...开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件: idea Maven包:Maven3.3.9+

    JAVA解惑(JAVA谜题) 中文版(PDF)

    Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...

    java解惑(java-puzzlers)源码.rar

    本书深入研究Java编程语言及其核心类为的细微之处,特写95个有关Java或其他类库的陷阱和缺陷的谜题,其中大多数谜题都采用短程序的形式给出。在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上...

    java解惑 for all javaer

    讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java程序员阅读。

    java迷题

    描述java语言的设计缺陷

    java-意想不到的迷惑

    Java解惑,以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java程序员阅读...

Global site tag (gtag.js) - Google Analytics