首頁  >  文章  >  後端開發  >  Java和.NET開發過程中的一些不同

Java和.NET開發過程中的一些不同

巴扎黑
巴扎黑原創
2016-12-19 16:55:101281瀏覽

用.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的格式要求更嚴格。

 

上面都是自己最近開發過程中根據自己遇到的問題分析和整理的結果,涉及的面有限,需要自己以後不斷完善相關技術點,並且整理和理解的結果也可能不完全準確,如有問題,請指正。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn