當需要對包、類、方法、值域、局域變量等這些元素進行更名時,請不要通過Search->Replace...或者Search->Replace in path...菜單來進行,而應該用重構功能來完成。如前所述,因為在一個工程中,元素可能已經有眾多的調用者,通過替換更名將很難保證定義和調用的同步更改,而重構則從語義關聯上提供同時調整的保障。應該說,有了重構,替換的功能在JBuilder將大大弱化。
1、值域及變量重命名
打開Java文件,將光標置於某個值域或局域變量的代碼標識處,通過Ctrl+Shift+R->Rename Field調出重構對話框:
圖4 更名值域或局域變量的對話框
·Class:值域或局域變量所在的類
·Old name:原名
·New name:新名
按OK,再點擊預覽窗口的 應用重構,JBuilder將所有引用的定位的地方都一起同步更改。
屬性重命名表 3
屬性和值域的區別是前者具有一個get/set訪問方法,更改屬性變量名時,必須同步更改其相應的get/set方法。可惜的是在編輯器中重構,你無法做到這一點,所幸的是,在UML浏覽器中JBuilder卻允許你進行這樣的重構。
假設Cat類有兩個屬性,一為age,一為name,現在希望將屬性name重構為nickname。切換到Cat類的UML視圖頁,鼠標右擊name屬性,在彈出的菜單中選擇Rename Property for name...,如下圖所示:
圖5 屬性重命名重構
彈出屬性更名重構對話框,如下圖所示:
圖6 屬性重命名重構對話框
在New name中鍵入nickname,點擊OK按鈕完成重構。JBuilder除完成屬性定義和引用的更名外,還完成屬性訪問方法名的重構:getName()->getNickname(),setName(String name)->setNickname(String name),並更改引用這兩個方法的所有調用。
2、方法重命名
將光標移到方法名處,Ctrl+Shift+R->Rename Method調出方法名更名重構對話框如圖所示:
圖7 方法重構對話框
提示:
如果一個方法的定位代碼為:public String cry(){/**do sth*/},需要將光標放到方法名cry處,才可以調出方法名重構對話框。
對話框中有兩個選項:
·Refactor ancestors:勾選這個選項時,如果當前方法是父類方法的覆蓋方法,或接口的實現方法,則父類方法或接口方法一並更改。
·Create fowwarding method:在Refactor ancestors選項取消勾選時,這個選項才可用,當選擇這個選項時,將產生的一個為保持版本兼容性的轉接調用方法,如你將public void foo()方法更名為public void foo_1()方法,該選項在重構的方法後產生一個轉接調用的方法:
public void foo_1(){/**do sth*/}//更名的方法
public void foo(){foo_1();}//轉接調用的方法
如果這個類已經發布,通過這個選項,即可以保證代碼的重構,又可以保證版本的兼容。
需要指出的是,方法更名重構只會對方法聲明及所有調用同步更改,方法的重載方法並不會相應更改,所以如果一個方法有3個重載方法,需要執行3次方法更名重構。
3、方法參數更改
方法參數的更改,包括以下內容:
·新增一個入參。
·刪除某個無用的入參。
·調整文件參數的次序。
下面是myrafactor.Horse類的getAccountPrice()方法:
代碼清單 1 參數重構示例代碼
1. private double getAccountPrice(int amount , double account)
2. {
3. return amount * price * account ;
4. }
5. public void printAccountPrice(int amount)
6. {
7. double account ;
8. if(amount <= 100) {
9. account = 1 ;
10. }
11. else if(amount <= 500) {
12. account = 0.9 ;
13. }
14. else {
15. account = 0.8 ;
16. }
17. System.out.println("總價為:" + getAccountPrice(amount , account)) ;
18. }
假設我們需要為getAccountPrice()新增一個price入參,並將amount和account參數的位置對調,將光標置於getAccountPrice()方法名處:Ctrl+Shift+R->Change Parameters of “getAccountPrice”調出如下所示的對話框:
圖8 方法參數重構對話框
按以下步驟完成重構:
1.點選參數列表中的amount參數,點擊Move Down將amount參數調到account之後。
2.點擊對話框的Add...按鈕彈出Add New Parameter的對話框,如下圖所示:
圖9
新增參數對話框
·Type:參數類型,下拉框中列出了基礎數據類型及String和Object對象類型,你也可以通過Type後的…按鈕選擇其他的對象類型。這裡我們選擇double類型。
·Name:入參的名稱,設置為price。
·Default value:默認值,很有必要,因為如果當前的方法已經被調用,則調用處用這個默認的值為新增的入參賦值,這裡我們填入1000.0。
你還可以定義數組類型的入參,通過Dimensions指定數組的維度,默認為一維數組。 點擊OK返回重構對話框。
3.在重構對話框中點擊OK完成方法入參的重構,如下圖所示:
代碼清單 2 入參調整後的代碼
1. private double getAccountPrice(double account, int amount, double price)
2. {
3. return amount * price * account ;
4. }
5. public void printAccountPrice(int amount)
6. {
7. double account ;
8. if(amount <= 100) {
9. account = 1 ;
10. }
11. else if(amount <= 500) {
12. account = 0.9 ;
13. }
14. else {
15. account = 0.8 ;
16. }
17. System.out.println("總價為:" + getAccountPrice(account, amount, 1000.0)) ;
18. }
JBuilder搜索所有引用原getAccountPrice()法的地方,完成入參順序的調整,用默認值為新增的入參賦值,如第17行引用了getAccountPrice(),重構後account和amount對調了順序,並新增了一個1000.0入參值。
4、類重命名
光標移到類名上,Ctrl+Shift+R->Rename Class調出類重命名的重構對話框,如下圖所示:
圖10 類重命名重構
在這裡,我們將myrefactor.Cat類名更名為PersianCat,JBuilder將完成以下的事情:
·將類名更改為PersianCat
·類的所有構造函數名更名為PersianCat
·類Java文件從Cat.java更名為PersianCat.java
·實例化類的代碼相應,如Cat c = new Cat()將更改為PersianCat c = new PersianCat()。
在沒有重構功能之前,更改類名是一項比較累人的差事,因為Java語法規定public類名必須和類Java文件名保持一致,類構造函數名也必須同類名一致,此外還需要和對值域或方法更名一樣保證調用一起更改。所以手工對類進行更名是比較麻煩的,而通過重構功能更改類名則不費吹灰之力。
5、包重命名
如果通過手工操作,則包重命名比類重命名的難度更大,因為Java語言規定包名必須和文件目錄保持一致,且包中可能會包括多個類,這些類被各自的調用者引用。用重構來完成包重命名將一並完成所有的事情。
要通過重構對包進行重命名時,如將包myrefactor更名為myrefactor_1,只需要打開包中的任何一個類Java文件,將光標移到包名myrefactor處:Ctrl+Shift+R->Rename Package調出包重命名對話框,如下圖11所示。
按OK重構後,JBuilder將完成以下的事件:
·將包中所有類的包聲明語句更名為package myrefactor_1;
·在<工作目錄>\src下創建myrefactor_1文件夾,並將原myrefactor文件夾下的Java文件移到myrefactor_1文件夾下。
·同步該包所有類的引用代碼,如將某類的myrefactor.Cat c = new myrefactor.Cat()更改為myrefactor_1.Cat c = new myrefactor_1.Cat()。
在包中任何類中對包名進行更名重構,包中所有類的包名都一起更改。如果你只希望更改某個類的包名而保持包中其他類的包聲明不變,則你可以通過ErrorInsight到達這個目的。假設包myrefactor中包括4 個類:Creature、Animal、Cat、Horse,你只希望將Horse的包名改為myrefactor_1,則你可以打開Horse.java,將光標置於類名定義外:Ctrl+Shift+R->Move Class,彈出如下的對話框:
圖11 對單個類進行包名更名重構
則JBuilder只會對Horse.java進行包名更名重構,而不變影響到包中其它的類