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

來源:互聯網
上載者:User
用.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的格式要求更嚴格。

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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.