程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JBuilder2005實現重構之重命名

JBuilder2005實現重構之重命名

編輯:關於JAVA

當需要對包、類、方法、值域、局域變量等這些元素進行更名時,請不要通過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進行包名更名重構,而不變影響到包中其它的類

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved