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

JBuilder2005實現重構之雜項重構

編輯:關於JAVA

1、優化import

簡而言之,通過優化import的設置可以達到以下的目的:

去除無用的import語句:如在類中沒有使用任何包中的類,則這個包的import語句可以刪除。

設置包的阈值:當前類引用包中類的數目大於這個阈值時,引入整個包(如import java.io.*),否則為包中每個被引用的類單獨指定的一個import語句(如import java.io.File)。

設置包的排列順序:按照一般的習慣,按包的常用程度從高到低進行排列,常用的包放在前面引入。一般情況下,JDK經典的包放在最前面(以java.為前綴),JDK擴展包緊跟其後(以javax.為前綴),接著是第三方類庫包(如org.apache.*),再次是自己開發的公用類庫,最後才是工程中的其他類。

通過Project->Project Properties...->Java Formating->在Imports設置頁中切換到Threshold標

圖25 設置包阈值對話框

簽頁中通過Package import threshold指定包的阈值,默認為0表示進行優化import後,用通配符以整個包的形式分別引入。

你也可以勾選Always import classes項,將每個類用單獨的import語句引入,這相當於將Package import threshold設置為無窮大。

在Imports設置頁中切換到Sort Order標簽頁,在此指定import代碼段的包引入順序及格式。假設myrefactor.jpx工程中有一個myrefactor.sub1的子包,我們通過以下步驟將其置為import引入代碼段的最後,並在前面添加一個空行:

1) 點擊Add blank line在列表中添加一個<blank line>,表示在import代碼段中添加一個空行。

2) 點擊Add prefix...在彈出的Add Prefix對話框中選擇myrefactor.sub1包。

3) 點擊OK保存設置。

圖26 import代碼段樣式設置對話框

此外,還可以通過Move Up和Move Down調整包在引入代碼段中的位置。列表中有一個<*>項,表示其他所有未匹配的包,如有一個以com.打開的包就放置在<*>的位置。

設置完後,在工程窗格的<Project Source>節點上右擊,選擇Format Package...在彈出的Fomcat Code對話框中確認選擇Optimize imports項,按OK後,JBuilder對工程中所有的類進行import代碼段進行優化重構。

2、自動添加異常捕捉

自動添加異常捕捉功能,從嚴格意義上說並不屬性代碼重構的范疇,因為編譯期的異常是一定要有捕捉代碼的,否則程序無法通過編譯。但在某些情況下,自動添加異常捕捉就是地地道道的代碼重構了,請看下面的代碼:

代碼清單 “面向編譯”的異常捕捉

1. public void autoCatch()
2. {
3.  try {
4.   FileInputStream fis = null ;
5.   byte[] bArr = new byte[1024] ;
6.   //會拋出FileNotFoundException
7.   fis = new FileInputStream("D:\\1.txt") ;
8.   //會拋出IOException
9.   fis.read(bArr) ;
10.  }
11.  catch(Exception ex) {
12.  }
13. }

第7行語句會拋出FileNotFoundExcetion,而第9行會拋出IOException,理應分別捕捉這兩個異常,但是開發人員也許對異常並不感興趣,所以直接捕捉Exception敷衍了事。由於Exception是所有異常的祖先類,所以這種異常捕捉方式並不會引發編譯錯誤,但它確實沒有做什麼有意義的事,只是為了通過編譯罷了,稱之為“面向編譯”的異常捕捉,即只為通過編譯。

程序發生異常時,要麼用throws將異常踢給調用者,要麼直接處理異常。如果打算直接處理異常,就必須對代碼中的異常分別處理,這樣才可以能夠異常的詳細信息,以及具體是哪個異常引起的。對於程序的用戶來說,詳細的錯誤信息可以讓他們更直接知道問題所在,而程序的調用者來說,具體的異常可以讓他們進行分別對待,分別處理,這種處理異常的方式稱為“面向問題”的異常捕捉。我們擬將這段代碼重構為以下的形式,如下所示:

代碼清單 16 “面向問題”的異常捕捉

1. public void autoCatch()
2. {
3.  FileInputStream fis = null ;
4.  byte[] bArr = new byte[1024] ;
5.  try {
6.   //會拋出FileNotFoundException
7.   fis = new FileInputStream("D:\\1.txt") ;
8.   //會拋出IOException
9.   fis.read(bArr) ;
10.  }
11.  catch(FileNotFoundException ex) {
12.   System.out.println("D:\\1.txt文件不存在,請檢查") ;
13.  }
14.  catch(IOException ex) {
15.   System.out.println("D:\\1.txt文件讀寫發生異常,異常信息為:" +
16.   ex.getMessage()) ;
17.  }
18.  finally {
19.   if(fis != null) {
20.    try {
21.     fis.close() ;
22.    }
23.   catch(IOException ex1) {
24.    System.out.println("關閉文件輸入流的時候發生異常,異常信息為:
25.     " + ex1.getMessage()) ;
26.   }
27.  }
28. }
29. }

你需要做的是刪除掉原來的“面向編譯”的異常捕捉代碼(即第5行和第10~12行),選中第6~9行,按Ctrl+Shift+C,JBuilder自動分析這段代碼,發現這段代碼中共有引發兩個異常,分別為每個異常生成兩個捕捉塊,代碼如下:

代碼清單 17 通過Ctrl+Shift+C自動添加異常捕捉代碼塊

1. public void autoCatch()
2. {
3.  FileInputStream fis = null ;
4.  byte[] bArr = new byte[1024] ;
5.  try {
6.   //會拋出FileNotFoundException
7.   fis = new FileInputStream("D:\\1.txt") ;
8.   //會拋出IOException
9.   fis.read(bArr) ;
10.  }
11.  catch(FileNotFoundException ex) {
12.  }
13.  catch(IOException ex) {
14.  }
15. }

然後,我們再手工添加上finally代碼處理塊,因為資源打開後,一般需要顯示關閉,以便快速釋放資源。調整的最後代碼如代碼清單 16所示。

實戰經驗:

雖然可以通過Ctrl+J以模板的方式快速錄入try...catch代碼塊,但是筆者還是傾向於用Ctrl+Shift+C自動生成異常捕捉塊,這樣不但提高了代碼編寫的速度,還保證異常捕捉代碼塊的規范性:為所有可能的異常分別生成一個捕捉塊,且將特殊的異常放在前面,一般性的異常則放在後面。

3、部署描述文件

如果你的工程中有一個Web模塊,依據你所選用的Web技術可能會有多個不同的部署描述文件,你可以直接通過這些部署描述文件進行重構類名重構,如下面是一段Struts關於FormBean的部署描述信息:

代碼清單 18 Struts有關formBean的部署描述文件

1. <struts-config>
2. <form-beans>
3. <form-bean name="untitled1ActionForm" type="myrefactor.Untitled1ActionForm" />
4. </form-beans>
5. </struts-config>

在編譯器中打開需要重構的部署描述文件,將光標移到<form-bean>標簽的type屬性值中,點擊右鍵->Refactoring->Rename Class for “UntitleActionForm”,如下圖所示:

圖28 在部署描述文件中重構類名的對話框

在New name中鍵入UserActionForm,點擊OK,JBuilder不但更改部署描述文件中的type屬性值,還將該屬性所對應的類名進行更名重構。

4、EJB

因為EJB設計器中知道一個EJB所有引用的類和接口,所以必須通過EJB設計器對EJB類進行更名。如果在編輯器或UML浏覽器中對EJB文件進行重命名重構,你將看到以下的警告信息:

WARNING: You are refactoring an EJB file. This may require
that you change some source code and the deployment
descriptor by hand. We recommend using the EJB designer for
most refactoring scenarios.

如果你選擇繼續,則需要手工更改其他相關的文件,並同時更改部署描述文件中的相關內容,稍有不慎即會發生遺漏,所以應當盡量在EJB設計器中來重構。

5、代理

假設一個A類有一個成員類(B類),B類有一個方法foo(),如果C類想通過A類調用B類的foo()方法,則必須這樣:

A aObj = new A();
aObj.bObj.foo();

實際情況可能會有更多的銜接層,為了減少這種層層嵌套間接調用所造成臃腫的代碼,有時我們直接通過代理使代碼顯得簡潔。在A類中提供一個代理方法foo(){bObj.foo();},這樣C類只要這樣就可以訪問B類的foo()方法了:

A aObj = new A();
aObj.foo();

JBuilder提供了一個代理成員類方法的方便功能,來看下面的MultiAnimal類:

代碼清單 19 MultiAnimal類

1. package myrefactor ;
2. public class MultiAnimal
3. {
4.  Cat cat = new Cat() ;
5.  Horse horse = new Horse() ;
6. }

打開MultiAnimal.java文件,Edit->Wizards->Delegate to Member...彈出如下的對話框:

圖29 代理方法

·Select class:默認為當前打開的類。

·Select member:列出當前類所有的成員類,下拉框將有兩個選項:cat:Cat及horse:Horse,我們選擇cat:Cat。

·Available methods:Cat類、Cat類的父類及Cat類的接口的方法,展開myrefactor.Habitable接口,選擇howl()方法。

·Visibility:設置代理方法的可視域類型,默認為Public,接受這個默認的值。

·Generate Javadoc for delegated methods:是否為這個代理方法產生Javadoc注釋,接受默認的設置。

按OK後,JBuilder為MultiAnimal類生成一個代理方法,如下所示:

代碼清單 20 生成成員類代理方法

1. package myrefactor ;
2. public class MultiAnimal
3. {
4.  Cat cat = new Cat() ;
5.  Horse horse = new Horse() ;
6.  /**
7.  * Delegate method void howl() to cat : Cat
8.  */
9.  public void howl()
10.  {
11.   cat.howl() ;
12.  }
13. }

此外,Edit->Wizards下還提供了其他若干個有用的功能,它們分別是:

·Add:內部類、值域、構造函數、方法、Javadoc、代碼模板。

·Edit Fields/Properties:編輯值域/屬性。

·Edit Javadoc:編輯Javadoc。

·Implement Interface:實現接口中的方法。

·Override Methods:覆蓋父類的方法。

但除Delegate to Member向導外,其他的向導使用的機會很少,你大可用其他的方法來完成這些功能。

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