马桶上的乱弹(乱谈JDK5.0 和 .net 2.0)

         因为横跨.netJava两个大阵营,所以没事就喜欢把他们两个互相比较,工作时也相互借鉴彼此的长处。平时工作、生活都挺忙的,也没有什么时间去关心两者的细节问题(因为我认为思想才是最重要的),只有在go to wc,坐在马桶上时,才有时间来关心关心。以下是某日突发奇想的乱弹,感觉有点好玩,今天又有点时间,特做笔记如下:

       首先灵感来自于对JDK升级的思考,Java发展快10年了,版本升级一直显示在次版上,从1.1至1.4,等到大家都以为Tiger应当叫1.5时,突然间就变成了5.0,跨了N个版本,始料不及啊,一直没有细想其中的原因(没时间没心情)。终于某日坐在马桶上时,想通了,Java也不容易啊,花了这么多年才升到1.4.Net几年时间就升到2.0了,JDK再以次版升下去,.Net 8.0了,JDK估计才1.8,这不是给人映像Java.Net还嫩了吗?不行,不行,怎么的也得升到5.0,以示差距。哈哈,这就是为啥JDK5.0能力没升多少,版本却飞奔的原因,竞争的压力啊。

       想到了JDK的升级,不能不想想JDK5.0.net 2.0,大家都出来了嘛(虽然一个还是b1),在心中比一比也好。

       两大阵营最新的升级大部分的表现在语法上(.net 我就只比C#了),最耀眼的就是两者同时支持了泛型C++的一切都开始学习了:)看了一下,对于泛型的支持,仅从语法上面说,Java要强于.Net.net 的泛型还是比较基本的,Java就相对复杂一些,当然.net 2.0还只是Beta版的嘛,不急不急,看正式版的。

       正是对于泛型的比较,让我的一个迷惑终于解开了,那就是为什么JDK5.0中并没有在VM中支持泛型。老早就听到了.Net方面攻击JDK5.0中的泛型是“假”的,最终还是以object进行操作,带来不了任何的性能优势,我以前也在想,JDK干嘛用这么明显的,这么容易怡笑大方的解决方案来支持所谓的泛型?

       那天,看完SUN官方站点上的文档才明白其主要原因。

原来,在JDK5.0中支持类型安全的代码与非类型安全的代码之间的相互调用,而.net 2.0中则是严格限制的。JDK中如此实现,也许是考虑到向下兼容的问题,毕竟以Java为基础的平台系统太多太多了,随意强制性的要求进行语法改动,估计会增加很多已有系统的维护成本,JDK5.0到时就会成为一个千夫所指的罪人。JDK的开发者,当然不想背这个骂名,因此搞了这么一个的“折衷”方案,有些让人感觉不伦不类。不过,JDK开发人员一向如此,如果在可移植性与性能出现冲突时,他们会毫不犹豫的选择可移植性。

估计这也只许只是权宜之计,因为在官方的文档中声明,在非类型安全与类型安全之间调用会带来很多潜在的问题,这些问题出现的可能性由程序员自行掌握,看到这段,我是彻底晕了,看来Java目前的版本只是做个缓冲期,给大家提个醒,我要搞泛型啦,大家快往那边转,等大家都熟悉理解泛型之后,再统一强制性的移植到“绝对”泛型之中。

       想完泛型,就想到了.net 2.0中新加入的匿名方法。这个匿名方法的使用与Java中的匿名类有很大的相似之处,虽然一个叫“类”,一个叫“方法”,从表面上看,两者有本质的不同,但是在大多数的实际应用中,确是一致的。两者大多数都是在添加事件监听器时使用,大家都是为了简化代码 ,从设计模式上说,添加的都是观察者,不同的是Java中需要添加的是观察类,而.net 中添加的是一个现成的被.net默认支持Delegete,而这个Delegete代理实际上起的作用还是观察类,只是这一步.net帮你做了。可见,匿名类与匿名方法名称上的差别,是由Java.Net不同的实现方式产生的,在设计上的作用实际上是差不多。前两天看到一篇文章,作者谈到.net的匿名方法时,将Java中事件添加麻烦性进行了反例举证,以证明匿名方法是强于Java的,呵呵,估计此作者只接触过.net,对Java了解并不多,并不知道还有匿名类这一东东。

       .Net2.0中新增了迭代,具体作用就不多说了,关于.net 2.0的特性的文章都说过了,不清楚的可以查看任何一本设计相关的书,不过这个新功能对.net 开发带来的方便性,并不明显,因为C#中早就有了foreach这么好用的东东:)现在只是配合泛型提高了性能与类型安全。呵呵,同样的虽然Java中早就支持迭代,JDK 5.0中还是增强了for语法,实际上就是把foreach学过去了,只是不愿意做得那么明显,说我学的.net的:)

       .Net中一个新东东就是partial,这个就没有什么好说的,我只能说这语法支持有利有弊,看程序员自己把握了。

       还有一点,就是Java终于支持枚举了,被人抨击N久了,终于舍得进步了,但是这个枚举却搞得有点过头,基本上和一个类差不多了,给人感觉就是类的重命名,为啥要这样,还没有想通,从CC#用了这么久,也没有见过这么用的,请有关大侠来解惑。

       以上是个人乱弹。如果你是哪个阵营的绝对支持者,俺说了什么话,又让你不高兴,就不要介意了,反正我是乱弹的。

posted on 2004-11-07 15:50  飞刀  阅读(3580)  评论(17编辑  收藏  举报

导航