引言
Eclipse是流行的Java集成開發環境(IDE)同時它還可以作為其它語言的開發環境(例如C++和Ruby)並且作為開發桌面或服務器應用程序的富客戶端開發平台如今Eclipse開源社區擁有幾十個開源項目其范圍從商務智能到社會網絡等各個方面Eclipse是非贏利性基金會的名字由它全面負責這些工程
Eclipse的每個版本在Eclipse的發行歷史上都具有裡程碑意義在年月日同時發行了共十個Eclipse工程本文將集中探討Eclipse 版本的IDE特別是它的Java開發工具(JDT)
JDT構成
JDT的歷史可以追蹤到在年用Smalltalk編寫的Visual Age for Java(VAJ)在VAJ中一切都被編譯並且全部被調入內存這種設計不能進行比例縮放難於擴展從而使其很難進行再創造
在年該IDE團隊開始開發Visual Age Micro Edition(VAME)這個工具開始完全用Java編寫並使用標准Widget工具箱(SWT)來實現其用戶接口當時的VAME的主要設計市場針對的是嵌入式空間中的開發與應用為此它使用了標准Java虛擬機並且讓工作區位於文件系統中然而文件和文件夾名字都是一些不能讀的UUID
與VAJ提供的編譯器相比VAME的增長式編譯器快了將近十倍這種模型是基於狀態構建的(與當前的Eclipse形成對照它是基於源碼的)VAME有它自己的倉庫系統Rapier並且可以使用插件方式來對之進行擴展
VAME一開始並沒有吸引社區開發者的注意力但是其中的確包含很多好主意開發者以後使用之來開發了他們的下一代工程Eclipse在年Eclipse 發行當時它被描述為一種通用的IDE並不特別針對於什麼內容從一開始Eclipse和JDT都被構建為一種針對其它開發工具使用的開發平台工作區存儲在磁盤上並且對其它工作區開放Eclipse 中使用的不是一種專利式數據倉庫而是集成了CVS
與其先行者相比Eclipse還有另一個重要區別它是開源的而且其用戶社區大量存在並且是自維持性的Eclipse 大多數的新的和改進特征直接來源於Eclipse用戶自從版本以來共有超過個請求被修改並得到增強去粗存精下面讓我們來重點分析幾個對於大多數Java開發者特別重要的特征
Eclipse編譯器
JDT的強有力的特征之一是它的內植的完全兼容於javac的增長式Java編譯器盡管你能使Eclipse使用Ant和javac甚至能夠使問題標記顯示於IDE中(這是版本中的新特征)但是Eclipse編譯器本身就提供了更好的診斷技術
該JDT編譯器最初的開發目的是針對VAME以後針對Eclipse作了修改這個編譯器基於開發者稱之的編譯三規則並在模式上遵循了Asimov的機器人學規則
正確性一個編譯器不能損害一個源程序
高效性除了與規則相沖突的地方之外一個編譯器必須是快速的
友好性一個編譯器必須幫助用戶糾正編程錯誤只要這樣的幫助不與規則和規則相沖突
正確性當設計一個Java編譯器時你不僅必須遵循相應的規范而且還要領悟該規范的精神只考慮正確性是不行的因此JDT開發者一直在努力奮斗以與其它編譯器基本保持一致(包括Sun的編譯器)在Eclipse (相比之下在VAJ中根本沒有進行單元測試)中僅針對正確性的檢查就超過多次的單元測試
高效性成千的工程和成百萬行的代碼往往是很經常的事情這意味著大量的問題例如內存消耗必須能夠被預測和加以分級需要解決Eclipse 使用回歸式優化策略對此作了進一步提煉例如開發者可以重寫一個流程圖以便使用位操作結果它從以前百分之的時間消耗降低到了百分之
友好性報告錯誤是一種藝術只用行號是不夠的二級錯誤被最小化例如如果你在一個文件中丟失了一個分號它不會影響所有另外它所依賴的文件改進的靜態分析功能有助於發現錯誤模式另外Eclipse還能夠對Javadoc進行正確性檢查
在版本中Eclipse編譯器是JavaSE兼容的Eclipse支持Java 分類和StackMapTable屬性(甚至在Java 發行之前)而且該編譯器提供了大量的新的診斷功能有助於你發現存在於代碼中的問題與版本的編譯器(提供了種診斷功能)相比VAJ則僅提供了種診斷功能最新的一些診斷功能包括針對如下內容的檢測
· 使用顯然是null的變量
· 不必要的null檢查
· 到方法參數的偶然賦值
· 切換大小寫
· 使用非泛型(原始)類型
· 未使用的標簽
· 不必要的$NONNLS$標簽
在默認情況下大多數的這些功能都處於off狀態當然你還可以使用@SuppressWarnings注解來把它們設置為off狀態
從版本開始如果你想在Eclipse外部使用Eclipse編譯器你可以單獨下載這樣的版本它的命令行兼容於javac並且下載尺寸僅有MB左右既然Eclipse編譯器是開源的所以大量的其它工程例如Apache Tomcat就可以綁定到其它的軟件當中
編輯器
任何開發環境的最基本的特征首先體現在編輯器上一般地你會把大多數時間花在其中因此編輯器必須是舒適不唐突強有力的而且能夠提供語法高亮顯示JDT使用它的Java模型來提供語法高亮顯示功能例如它十分清楚類與實例變量之間的區別因此它能以不同的顏色來標志它們它甚至能夠窺探源碼注釋來指出是否你調用的一個方法是過時的(或不推薦使用)並且針對這一方法調用繪制一條線以強調這一部分代碼值得注意
在Java編輯器中的一個有用的命令之一是Ctrl+Space(內容助理)不記得一個對象的方法有哪些或如何拼寫一個類名嗎?只要按下Ctrl+Space那麼Eclipse將在任何給定點提供一個有效的可能性列表Eclipse 繼續改進這個特征例如當你輸入長標識符例如LongJavaName時現在你可以輸入LJN並且按下Ctrl+Space那麼Eclipse就會知道你的意思這稱作CamelCase completion當進行類型查找時它也能工作(Ctrl+Shift+T)
你是否厭煩了輸入詞語例如StringBuffer buffer = new StringBuffer();?現在不必再重復了在版本中你可以輸入SBCtrl+SpaceSpaceCtrl+Space = newCtrl+Space();來代替在此我們使用了次擊鍵來代替了次擊鍵想在一個變量名前加入一個不同的前綴嗎?沒有問題只要在第二個Ctrl+Space之前輸入它即可例如在版本中Element root+Ctrl+Space完全等價於Element rootElement(見圖)
圖在版本中內容助理(Ctrl+Space)繼續得到改進現在它支持CamelCase並且保存已經輸入的字符
下面一項特征更節省時間在版本中Ctrl+Space將根據你的使用模式動態地重排它的建議因此例如如果你總是把ArrayList實例賦值給List變量那麼ArrayList建議將排在第一位以便你可以更快地選擇它現在代碼完成功能甚至能夠工作於Javadocs中因此你可以創建@links或常用引用而不必記住這些長名
你是否提出過這樣的問題如果IDE足夠聰明能夠找出在這一行中存在問題那麼它為什麼不能改正它?如今Eclipse加入了一種特征稱為Quick Fix它可以實現這一功能甚至更多只要把你的光標放到有問題的一行代碼上並且按下Ctrl+鍵那麼Eclipse將提供有關於修改它的建議
Eclipse的每一個新的發行版本都加入一些新的修改例如在版本中如果你得到關於使用原始類型的一個警告那麼你只要把光標放到那一行上然後按下Ctrl+並且選擇一種修整例如Add type parameters即可還有在版本中Quick Fix能夠維護同一個文件甚至在多個文件中的許多問題而不必單獨處理每一個問題
我想強調的另一個特征是重命名類型如果你象我一樣那麼你會經常把你的變量和方法類似於你的類型命名例如如果你有一種Bar類型那麼你可能有一個變量fBar和一個方法createBar(見圖)問題是如果你想把Bar重命名為另一個名那麼你還要修改其它大量的地方但是在版本中把具有相似名字的變量和方法統一地改變為你想要的新名字是極其簡單的事情這種神奇的重命名功能是版本提供的我最喜歡的特征之一
圖當你在Eclipse 中重命名一類型時它提供具有類似命名的重命名變量和方法
運行
在一些IDE中你一般要設置一個工程為主工程並且使用一個全局的Run命令來運行這個程序相比之下Eclipse卻不是以這種方式工作在Eclipse中你擁有一串啟動配置它們包含有關於運行調試或測試代碼的所有的詳細資料例如命令行參數類路徑JRE版本等等在Eclipse 中通過使用過濾和執行環境管理啟動配置更為容易
過濾讓你根據你感興趣的內容進一步裁減配置列表執行環境讓你使用一種通用命名例如JSE來描述一個Java運行時刻的能力Eclipse能夠選擇滿足或超出你指定要求環境的JRE版本
你是否曾發現自己在開發期間不斷地運行多個測試集?在版本下你可以在同一時刻運行多個測試集並且你可以回溯和查看以前運行的歷史Eclipse 還支持最新版本的JUnit(版本)
團隊開發
你是否曾發現自己盯著一行代碼發愣誰加入的這些代碼?為什麼?Eclipse 能顯示基於顏色的注解以便確定在當前文件中各部分內容的作者這是通過讀取CVS歷史(見圖)實現的把鼠標停在一個更改塊上將顯示開發者的姓名相應的日期和注釋信息它還會高亮在文件的其它部分中作過相同修動的代碼
圖CVS Quick Diff注解顯示基於顏色的注解(在當前文件中各個部分的作者)在某一部分上停留鼠標將顯示該修改版本的細節
我確信你也有這種體會你調用其他人編寫的代碼並且一切都能順利工作直到它們以一種新的版本出現然後你開始遇到一些過時的警告更有甚者出現一些編譯錯誤直到你修改你的程序來適應其改變好了現在的Eclipse 引入了一種非常酷的特征稱為重構腳本極大地簡化了這一過程
當然重構簡單地意味著改變源碼而不改變其行為例如也許存在拼錯的字段或者一個方法需要一個新的參數Eclipse一直為自動化類似的修改提供良好的支持而且現在它還為消費者也提供了幫助
你實現的每個重構操作都記入歷史Eclipse 讓你把這一歷史寫入到一個腳本文件中以後再使用之你可以把這些腳本保存到CVS中或把它包括到一個JAR文件中這樣以來該JAR的用戶就能夠在他們得到一個新版本時恢復同樣的改變這與應用補丁是不同的補丁只能針對導致它們的具體的源文件操作而重構腳本卻能夠針對任意的使用重構API的源碼文件操作
維護一種不斷增長的API是一項相當困難的工作現在Eclipse使得這一工作容易多了當你重命名一個方法時Eclipse 能夠保持舊的方法不動把它標記為過時的然後對之進行重定向以便調用一個新方法並制作一個重構腳本以自動地轉換所有調用者當它們導入你的新的JAR文件時
代碼清潔器
一直以來Eclipse具有一種相當強的代碼格式化功能以幫助整個團隊的代碼格式化標准在版本中提供了一個新的Clean Up向導(見圖)進一步加強了這一功能下面列出這個向導的一些選擇實現功能
· 刪除不用的導入功能
· 刪除不用的private方法和構建函數
· 添加缺乏的@Override和@Deprecated注解
· 添加缺乏的$NONNLS$標簽或刪除不必要的那些標簽
· 把所有循環轉換成增強式的for循環
· 把控制語句體轉換成塊
· 刪除不必要的強制轉換
· 把串行序列版本ID添加到Serializable和Externalizable類
Clean Up向導能夠在一個Java文件一個包甚至整個工程上運行
圖Clean Up向導讓你在整個工程范圍內應用一致的標准
結論
如今比較於任何其它語言和平台來說有相當范圍的工具可以供Java程序員選擇利用我也搞不清楚這其中的原因也許這是用戶的巨大能量和積極性所致或者是缺乏單個主流供應商的結果無論什麼原因Eclipse都能夠與許多選擇對象包括NetBeansIDEAJDeveloper和JBuilder進行媲美隨著版本的發行Eclipse對Java IDE的許多方面都是一次大的躍進這將會使所有的Java程序員受益不管你最終選擇哪一種工具
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28961.html