Java与.NET随笔
.NET与Java,因这两种技术的相似性,总是会让人拿来做比较,并且总有人想让二者一分高下,最后得出孰优孰劣的结论。由于本人先用.NET,后转Java,现在.NET与Java二者并用,所以对二者间的差异颇有体会,胸中之词,不吐不快。
CLR VS JavaVM。虚拟机的概念让Java/C#这些比C/C++更为高级的语言成为现实。Java虚拟机的确是划时代之作,在功能、性能、跨平台等各个方面都非常强大。后来微软.NET中的CLR必然是借鉴了Java虚拟机的诸多优点,但CLR并未超越JavaVM,在跨平台等方面还存在劣势(mono还不够实用),但是应该说在Windows下,CLR已经足够好用了。因此,在这一级别上二者应该是半斤八两,.NET半斤,Java八两。
C# VS Java。虽然C#推出要比Java晚很多,但是C#已经由模仿到发展,并实现了快速超越。.NET版本推陈出新,快速发展,而Java语言的发展则显得疲软无力。C#与Java都传承了C++的语言风格,但C#在语言级别加入了更多新特性:属性(property)、索引、委托等,这些新的语言特性让人在用C#写程序的时候感觉就像是在写说明书一样清晰简单,而Java至今仍不肯加入这些特性,为了实现相同的目的,Java程序员不得不使用一些开源包、一些编程约定、一些限制规则等拐弯抹角的实现简单的功能。或许有人对此不以为意,认为只要由方法可以实现的特性就没必要加入到语言中来。但是看一看.NET的每一次版本更新都会带来更加简洁的语法,更少的代码即可实现更多的逻辑,这不就是编程语言不断发展的意义所在么?在.NET2.0的时候,在Class里面写get/set属性已经够简单了,但到了.NET3.0以后的版本,连get/set属性的方法体以及私有变量都可以省略掉了,而在Java里面,就不得不遵守约定的get/set方法的命名格式,不断的检查方法名称是否正确,并编写大量的代码来维护这些get和set方法,即使这些代码是由编辑器自动构造的,你也不得不面对这些枯燥的重复代码以及代码维护的问题。此外,Java还有一个让人十分费解的设计。在C#中,一切类型都是类,使用int和使用Int32是完全一样的,而在Java中,使用int和Integer则完全不同,int是一种值,而Integer则是一种类型,最要命的是在很多时候两者之间不能自动转换,即使是手动转换也可能由于Integer类型等于null而导致转换失败,这个设计简直就是C++中空指针问题的延续,这样的设计问题比比皆是,虽然问题都很小,但使用起来十分不便,有时候都怀疑Java是否真的比C++更高级。时至今日,Java已经开始模仿C#了,Java语言后来的标注特性就是参考了.NET的属性(Attribute),而在Java7中即将到来的新特性在.NET中都能找到原型。Java语言已略显老态,以JVM为基础的Scala和Groovy等新兴语言大有替代Java的趋势。
.NETFramework类库VS开源Java库。作为主流的编程语言,肯定都离不开一整套类库支持来实现基础性的功能。不同的是.NET的类库一般都由微软提供,而Java的类库一般都由开源项目提供。当我们需要某一.NET类库时,常规的做法是查阅MSDN,查看微软提供的代码示例,然后模仿这些代码即可;而当我们需要一个Java类库时,一般的做法是到google或是开源社区搜索相关的开源项目,然后选择所需要的类库。至于两种方式哪一个更好则很难说,但使用微软的.NET类库通常更简单。虽然.NET也有开源类库,但大多数.NET程序员都不会意识到还需要第三方类库,微软提供的类库已经足够了。当选择开源类库的时候,我们可以自豪的说,我们不用受制于微软的技术压迫,但是实际历程可能是十分痛苦的。开源当然有其优点,但当为了一个功能,而面对数个Java开源项目会怎么样?你可以庆幸你有ABCD多个选项,但选择并不是件容易的事情。你不得不逐个的去学习研究每个开源类库的设计结构、应用方法,逐个评估每个开源类库的功能、性能,还有与需求之间的差距,除此之外,还要评估所选定的开源类库是否能够和其它类库一起工作,是否存在潜在的冲突等等。当需要很多类库、解决方案的时候,这种选择足以让人抓狂,这个时候你就会感叹,要是没有选择该多好。除此之外还有另外一个差异:类库风格与质量。由于微软的企业化和工程化程度很高,海量的.NET类库风格都能保持完全一致,让人感觉所有的代码都是一个人写出来的;而开源项目都是由各个社区自发开展的,设计风格千差万别,代码质量也良莠不齐,Eclipse里面有一个代码重构的插件,当使用此功能进行代码重构时,它甚至可以查找到配置文件中的类型引用并准确无误的重构该引用,让人惊叹是谁写出来如此鬼斧神工的强大功能;而同时又发现在dom4j类库中,一个很常用的方法竟然没有对参数做非空检查,导致四处抛出异常,真想把作者揪出来大骂一顿竟然会出现这么低级的错误。当然大部分的开源项目都是很不错的。凡事有利亦有弊,Java对程序员的折磨并非没有回报,就像C++程序员要比Java程序员牛一样,一般Java程序员在构架设计、模式设计以及对技术原理的理解上,都要比.NET程序员略胜一筹。微软的温室培育出来的大多数.NET程序员在面对苛刻复杂的问题时会显得乏力,而对Java程序员来说,狂风骤雨只是家常便饭而已。
VisualStudio VS Eclipse。虽然记事本也可以编程,但我相信肯定没有人会这么做,编辑器对于开发的重要性就不做讨论了。Eclipse并不是Java开发的唯一选择,但Eclipse是颇具代表性的主流开发工具。VisualStudio 秉承了Windows家族的一贯风格:高度集成、简单易用。Eclipse也秉承了开源家族的一贯风格:功能强大,无所不能,但操作却不甚友好。VS的用户很少会意识到还需要更多的插件更多的功能,也很少花太多时间去学习VS的使用方法;而Eclipse的用户如果不会配置插件不会修改各种配置几乎无法使用Eclipse,而且要花费不少时间来学习如何使用Eclipse,还是稍有难度的。但是说到功能,那就说到Eclipse的强项了,通过添加各种插件,Eclipse几乎无所不能,甚至可以改造成C++、php、.NET的开发环境。Eclipse作为Java的IDE在代码编辑重构方面尤其优秀,在代码调试时可以实现边修改边调试的代码热交换,在这些功能上,VS难以望其项背。Eclipse的大多数界面操作都是异步进行的,尤其是在编译上,速度优势十分明显,而VS总会在编译时出现假死,编译速度很慢,当项目很多时让人难以忍受。
行业应用与厂商支持。微软有一整套完整的软件生态系统,只要使用微软的产品,那么一切问题都由微软包办了。但微软不是万能的,微软包办的只能是一部分问题,在微软不可企及的领域,就是IBM、HP、Oracle等各大软件商的天下。由于微软产品的定位,微软的软件生态体系比较接近于终端用户,因此在行业应用上就更靠近中低端,而在大型应用项目中经常会见到Java的身影。因此在大型应用和软硬件厂商支持上,Java的确比.NET更流行。目前如此,以后会如何发展尚未可知。
纵观.NET与Java的技术体系,会发现二者有颇多相似,也有很多差异,最本质的差异应该是软件开发思想上的差异,它们二者分别代表的是商业软件体系与开源软件体系,它们的差异也正是这两大体系阵营的差异。商业软件以服务客户为首要目标,在必要时宁可牺牲性能也要保证用户的良好体验;而开源软件以解决问题为首要目标,在任何时候,软件的功能、性能、适应度都是最为重要的,用户的感受则其次。(客户花钱买服务,当然有权吹毛求疵;用户免费使用别人的服务,当然要心存感激。)
.NET与Java就像是两兄弟,性格迥异,各有所长,只有在特定的环境下才会存在一种最优解,单纯讨论二者孰优孰劣,没有什么意义。当洞悉了语言背后的技术真想你就会发现,什么都是浮云,语言仅仅是工具而已。更高层次的解决方案设计、构架设计、项目控制等才是软件开发的真谛!
Java与.NET随笔的更多相关文章
- Java范型随笔
最近在帝都好无聊啊, 排遣寂寞就只有让自己不要停下来,不断的思考了 QWQ; 最近做ndk, java有点忘了,突然看到了一些java范型方面的问题, 踌躇了一会, 想着想着,决定还是写个随笔记录下来 ...
- Java学习的随笔(3)接口
首先是一段<Java编程思想>中,对接口的解释:“interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现.它允许创建者确定方法名.参数列表.返回类型,但是没有任何 ...
- Java学习的随笔(2)Java语言的三大特性
1.面向对象的三大特性 面向对象的三大特性主要包括:继承.封装.多态 (1)继承:就是指子类(导出类)获得了基类的全部功能(所有的域和方法). 注:在子类中,想要调用基类的方法可以使用“super. ...
- Java学习的随笔(一)对象概念、this指针、权限修饰符
最近在看<Java编程思想>,下面按照最近看书的顺序梳理一下心得,由于是初次学习,大部分心得是摘抄自书中: 1. Java中,每个变量都是一个对象. 在创建时首先在内存的堆栈中创建一个该对 ...
- Google Java 风格 阅读随笔
官方文档:Google Java Style 中文翻译版:Google Java编程风格指南, Hawstein's Blog 可以先看官方文档,遇到不确定有疑问的,可以再对照翻译版本阅读,加深理解. ...
- 20130620—ant和java杂学随笔
ant知识点: 1.使用属性定义相对路径的时候,一定要使用location,而不要去使用value 对于<property></property>中location和valu ...
- Java并发编程随笔
死锁:两个线程互相等待对方释放锁才可以继续运行. 避免死锁的常见方法: 1.避免一个线程同时获取多个锁 2.避免一个线程在锁内同时占用多个资源,尽量保证一个锁只占用一个资源 3.尝试使用定时锁,使用l ...
- java程序员随笔
之前坚持过一段时间的博客,不过后来因为一些琐事,也因为自己的懒惰,没坚持下来.一晃本科毕业到现在已经快9年了,本科毕业的时候经常想,自己十年之后会是什么样子,那时候筹措满志,心里的每一个答案,都离现在 ...
- 深入理解Java虚拟机之Java内存区域随笔
1.java内存区域与内存溢出异常 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域:1.程序计数器,2.栈(虚拟机栈和本地方法栈 ),3.堆,4.方法区(包含 ...
随机推荐
- 【XLL 文档翻译】【第1部分】 Add-in 管理器 和 XLL 接口函数
xlAddInManagerInfo/xlAddInManagerInfo12 在 Excel 会话中,每一次调用 Add-In 管理器时,系统会调用这两个函数.此函数可以在 Add-In 管理器中提 ...
- 细谈WEB标准
最近有些朋友很是疑惑web标准是什么,我在这里先做一个总结,有更好的见解的可以私信给我! 首先切入正题之前先谈一下什么叫DOCTYPE,DOCTYPE是document type(文档类型)的简写,主 ...
- python基础——第三方模块
python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的. 如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了. 如果你正在使用Window ...
- Android自学指导
如果想自学Android,以下的文章可以作为参考: 如何自学Android(Gityuan) 那两年炼就的Android内功修养(老罗的Android之旅)
- MVC学习笔记--跟小静学MVC相关语法特性小补习
http://www.cnblogs.com/janes/archive/2012/10/15/2721101.html http://www.cnblogs.com/h82258652/p/4795 ...
- Jquery.Datatables 导出excel
按钮(Buttons) BUttons v1.1.2 下载地址:http://pan.baidu.com/s/1c0Jhckg JSZip v2.5.0-21-g4fd4fc1 下载地址:http:/ ...
- MVC – 14.ajax异步请求
14.1.配置文件 14.2.AjaxHelper – 异步链接按钮 14.3.AjaxHelper – 异步表单 AjaxOptions常见属性: 14.4.AjaxOptions对象生成[对应]触 ...
- Visual Studio 推荐插件--高量,变量高量,语法高亮
1 WordLight for 2008 下载网址:http://visualstudiogallery.msdn.microsoft.com/ad686131-47d4-4c13-ada2-5b1 ...
- GPS NEMA 0183协议
转自:http://www.cnblogs.com/xidongs/archive/2011/02/01/1948689.html 一. NMEA0183标准语句(GPS常用语句)$GPGGA例:$G ...
- .net学习之CTS、CLS和CLR
CLR:公共语言运行时,就是所有.net语言写的程序的公共运行时环境,比如C#.VB.Net等语言写的程序需要运行在CLR上,然后CLR解析执行操作系统的相关指令,CLR是.net程序运行在操作系统的 ...