马桶上的乱弹(乱谈JDK5.0 和 .net 2.0)
首先灵感来自于对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久了,终于舍得进步了,但是这个枚举却搞得有点过头,基本上和一个类差不多了,给人感觉就是类的重命名,为啥要这样,还没有想通,从C至C#用了这么久,也没有见过这么用的,请有关大侠来解惑。
以上是个人乱弹。如果你是哪个阵营的绝对支持者,俺说了什么话,又让你不高兴,就不要介意了,反正我是乱弹的。