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#一样快捷易用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值