用.net平台下的c#语言开发了比较长一段时间,最近项目开始用java来开发了,本文通过自己开发过程中的一些感受说下它们在具体开发过程的不同点,由于经验知识还有限,本篇文章只能从比较表面的以及自己常用的功能点来说明我所看到的不同点。
我是用vs2008和vs2010开发.net程序,通过myeclipse8.5开发java程序,下面从ide、语言、插件的不同点来做下简单的说明。
ide的不同点:
给我的第一感觉就是myeclipse在开发过程编写查看代码也非常便利,甚至有很多vs没有的功能,下面列举自己现在遇到的一些不同点:
1、一个变量字段选中后,其他用到该字段的背景颜色自动凸显出来,方便查看有哪些地方用了这个变量,vs2010之前是没有这个功能的。
2、对于一个大括号或小括号的代码段,双击该符号后面,则自动选中括号内部的代码段,这个可以方便查看一个代码段,vs没有这样的功能。
3、myeclipse没有像vs里的#region,#endregion一样的代码段区域,在一个方法或类里,可以#region 功能点….#endregion这样把代码片段折叠起来,myeclipse除非用其他一些插件才能达到这个效果。
4、ctrl+alt+t和ctrl+alt+r快捷键,这个快捷键在myeclipse里非常有用,可以分别快速查找工作空间里的type或者resource,可以快速模糊匹配找到文件或某个类型的文件,而vs没有找到这样的功能。
5、myeclipse智能提醒默认比较简单,只要在输入.后才会自动提醒,可以在window->preferences->java-editor->contenet assist标签页的auto-activation框里的auto activation triggers for java设置成.abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz,这样设置后,在myeclipse里输入任意字母就能提示了,但是它区分大小写,不像vs输入小写a也能智能提示大写a开头的变量类型等。
6、myeclipse经常遇到编码问题,对于新手非常不便利,它分为文件打开乱码,和提交请求中文内容乱码两种情况。当工作空间包括多个项目时,有可能一个项目是用gbk编码,另外一个是utf-8,这样就会导致单个文件乱码,设置整个工程编码在window->preferences->general->workspace选择text file encoding里的other设置,为单独项目在project右键properties->resource选择text file encoding里的other设置。对于jsp等提交请求内容默认编码是iso-8859-1,也经常导致乱码,可以在windows->preferences->general->content types里的text设置不同文件的编码。但是vs没有这么多乱码问题,对新手不容易出现乱码的问题。
7、myeclipse经常会提示内存溢出等相关内存问题,对于新手也是比较困惑的事情,往往是内存默认配置不够等造成的,修改myeclipse.ini里-vmargs下面的配置参数,比如-xmx912m表示最大分配堆内存912m,-xx:maxpermsize=556m表示最大分配非堆内存556m,这个可以让myeclipse内存可能够用。但部分内存溢出,可能是jvm内存占用溢出,就需要单独设置jvm的内存参数了,在window->preferences->java->installed jre里的,选中默认jdk,然后选择edit,在default vm arguments里配置相关参数即可。如果跑的程序是web程序,可能还需要设置tomcat的内存设置,在window->preferences->myeclipse->servers->tomcat,选中对应版本的tomcat,然后选择里面的jdk节点,在optional java vm arguments里设置内存参数。相对来说vs就不会有这么麻烦的处理了,一般都不用设置内存参数。
8、调试代码的时候,vs就表现出比myeclipse更强大了,它们都可以在断点处修改已经存在的变量的值,但是vs在监控临时变量框里输入变量时同样可以智能提示自己写的代码,而myeclipse不能自动提醒,并且vs可以拖动断点到已经运行的代码,这个功能在调试问题时是非常强大和有用的,但是myeclipse不能拖动断点。
9、默认的ctrl+左键点击,可以快速定位到该字段或类型的定义处, 和f3一样,但是我觉得ctrl+左键开发过程中更顺手,比vs里默认的f12快速定位会感觉更便利,而且它集成spring后,ctrl+左键可以选择定位到注入接口的子实现代码,这样可以很方便的查看实现代码,而vs当使用spring.net集成时,是不提供这个功能的。
10、myeclipse里右键-source,可以有很多比较方便的功能,比如生成getter,setter和继承接口父类方法。
11、java项目是通过导入方式打开,不是通过像vs里双击.sln或.csproj文件就可以打开整个工程。但是打开一次过后,下次再打开myeclipse,它都会自动加载已经打开过的项目。而vs是每次只能打开一个解决方案,解决方案里包括不同项目。如果新增了解决方案,下次就需要单独打开了。
12、myeclipse导入新项目,如果jre版本不一样,需要选择使用本地jre版本,项目右键->build path->configure build path->libraries->java build path里修改jre版本,但有时还会出现编译问题,原因是没有选择编译的jdk版本,项目右键->build path->configure build path->java compiler里修改compiler compliance level。对于vs,高版本代码打开低版本代码,会自动升级,或者手工选择在.net哪个版本下编译,会比较方便。
13、myeclipse双击代码编辑框里文件的tab栏,就可以切换全屏显示代码编辑块和多框显示,这点比vs更方便一点,package explorer框的旁边有个link vith editor按钮,可以快速定位文件在包里的位置,这个也比较方便,但是vs里一个文件右键后可以直接选择打开对应的物理文件目录,在myeclipse里没有这个功能。
语言的不同点:
java语言和c#语言非常相似,虽然内部会有很多区别,提供的api也不一样,但开发一个具体功能点的思路常用的都差不多,由于对比较新的技术和特性开发过程中接触不多,我所遇到的不同点包括:
1、java包的名字是和物理文件位置一一对应的, c#里命名空间可以随便写,并且编译出来的程序集也可以随便更改,可以不和命名空间保持一致,程序集和java里单独打出来的jar包是差不多的意思。
2、java的一个文件只能有一个公共类,而c#可以多个公共类在一个文件里。
3、如果找到一个jar包,java查看新jar包的方法字段描述,需要有单独的对应jar包的doc文档,才能看到接口调用参数说明,否则看起来不直观,但是如果有源码打出来的jar包,调试的时候可以方便的看到该包的源代码。.net里只要有了dll文件,就能方便的看到方法元数据调用参数,但是看到参数详细说明,还是需要对应dll的xml文档。
4、对于web开发,java里filter,servlet,listener是很常用的,java里的filter可以用.net里的module来实现一些功能,但filter可以制定作用请求范围,module是全局控制的;servlet相当于一个具体的handler,可以对制定请求进行处理,listerner可以用.net里的application_start里来完成一些功能,但是java里集成了部分默认listerner,它在web应用启动的时候就开始执行。它们的具体执行流程为:web启动时,listener的contextinitialized方法->所有filter的init(不管filter-mapping的值)->所有配置了load-on-startup大于等于0的servlet的init方法(不管servlet-mapping的值),具体请求为:具体servlet的init(只执行一次)->filter dofilter(请求配置的filter-mapping的value)->servlet service; 最后网站释放的执行顺序为:filter destroy-》listener contextdestroyed。
5、java里的final关键字,当给一个字段时,表示该字段不能修改,构造函数里都不能修改,这个和c#的const有点像,但是const默认是static的。和c#的readonly也比较像,但是readonly可以在构造函数里修改。当它作为一个方法的修饰符时,它类试c#的sealed类,不能重写它。
6、java里没有静态构造函数,如果要实现一些初始化工作,需要用静态代码块,static{…},里面输入内容即可,c#只有静态构造函数的说法。
7、java中有常量池概念,是和堆、栈不一样的区域,虽然和c#一样string都有字符串驻留机制,但是和.net的又不一样了。因此java里字符串比较最好用equals比较,否则可能出问题。比如a+b字符串在常量池里,如果它们和”ab”比较将相等,但是a+b,b是一个变量,就将放到堆里了,如果还用==”ab”判断将返回false,所以java里尽量用equals来判断字符串,但是.net里不涉及这个问题,经过计算的字符串,==的结果也会相等。
8、java里每个文件只要有main方法入口,它都可以运行,而.net里需要项目类型修改为控制台应用程序,然后有一个main方法才能作为一个运行的载体。
9、byte类型的数字范围不一样,java里是-128到127,.net是0-255,一般需要互相交换数据和处理都是转换成16进制,然后取8bit的后2个bit,这样它们的值都是一样的,方便同步加密解密或相关处理
10、java里推荐用get,set方法来对内部变量赋值和获取值,.net里可以用字段get,set获取,并且vs2008后可以直接get;set;的方式,借助语法糖,编译器后会自动生成等价的get,set内部字段。
11、java里文件保存后默认自动编译,但是这个也得益于它把每个java文件编译成一个class文件,.net里需要单独每次执行编译项目,因为它一个项目一个dll文件,如果保存其中一个.cs文件都执行编译,则工作量太大影响开发速度。
12、java里list是一个接口,这个对在c#里用惯了list集合的,new list已经会报错了,而且它们的泛型也不一样,c#是clr层的泛型支持,java的泛型不是经过jvm支持的,因此性能相对没有提升。
13、java里默认修饰符是包内可见(对应同一个文件夹目录,而不是项目大jar包下)的, protected的变量和方法都是包内和子类可见的,.net里是只有自己和子类可见。.net里类的默认修饰符是internal,程序集内可访问。方法和字段默认为private的,和java默认包内可见不一样。
http://lawson.cnblogs.com/
插件的不同点:
1、myeclipse自身就是一个插件,里面集成了大量开源框架,而vs是微软一个大一统的ide,要用其他开源插件,需要单独下载和单独配置。
2、java里实现webservice的方法很多,除了javax.jws包里只有的jax-ws,java webservice规范自带版本,还有axis,xfire的webservice开源实现,axis包括axis1,axis2,xfire已更名为cxf了,但是各种实现方法各异,在和.net发布的webservice互相调用时,经常遇到一些问题,总体来说java对wsdl的格式要求更严格。
上面都是自己最近开发过程中根据自己遇到的问题分析和整理的结果,涉及的面有限,需要自己以后不断完善相关技术点,并且整理和理解的结果也可能不完全准确,如有问题,请指正。