Java編碼規(guī)范 ?
?
?
作者:酷頁 來源:InterNet 加入時間:2003-7-24? ?
?
?
1. Java 命名約定
?
除了以下幾個特例之外,命名時應(yīng)始終采用完整的英文描述符。此外,一般應(yīng)采用小寫字母,但類名、接口名以及任何非初始單詞的第一個字母要大寫。
1.1 一般概念
?
n 盡量使用完整的英文描述符
n 采用適用于相關(guān)領(lǐng)域的術(shù)語
n 采用大小寫混合使名字可讀
n 盡量少用縮寫,但如果用了,要明智地使用,且在整個工程中統(tǒng)一
n 避免使用長的名字(小于 15 個字母是個好主意)
n 避免使用類似的名字,或者僅僅是大小寫不同的名字
n 避免使用下劃線(除靜態(tài)常量等)
?
1.2 示范
?
包(Package) 采用完整的英文描述符,應(yīng)該都是由小寫字母組成。對于全局包,將你的 Internet 域名反轉(zhuǎn)并接上包名。 java.awt,com.ambysoft.www.persistence
類(Class) 采用完整的英文描述符,所有單詞的第一個字母大寫。 Customer, SavingsAccount
接口(Interface) 采用完整的英文描述符說明接口封裝,所有單詞的第一個字母大寫。習(xí)慣上,名字后面加上后綴 able, ible 或者 er,但這不是必需的。 Contactable,Prompter
組件/部件(Component) 使用完整的英文描述來說明組件的用途,末端應(yīng)接上組件類型。 okButton, customerList,fileMenu
異常(Exception) 通常采用字母 e 表示異常。 e ?
類變量 字段采用完整的英文描述,第一個字母小寫,任何中間單詞的首字母大寫。 firstName, lastName
實參/參數(shù) 同字段/屬性的命名規(guī)則 public void setFirstName(String firstName){ this.firstName = firstName;}
局部變量 同字段/屬性的命名規(guī)則 ?
獲取成員函數(shù) 被訪問字段名的前面加上前綴 get。 getFirstName(), getLastName()
布爾型的獲取成員函數(shù) 所有的布爾型獲取函數(shù)必須用單詞 is 做前綴。 isPersistent(), isString()
設(shè)置成員函數(shù) 被訪問字段名的前面加上前綴 set。 setFirstName(), setLastName(),setWarpSpeed()
普通成員函數(shù) 采用完整的英文描述說明成員函數(shù)功能,第一個單詞盡可能采用一個生動的動詞,第一個字母小寫。 openFile(), addAccount()
靜態(tài)常量字段(static final) 全部采用大寫字母,單詞之間用下劃線分隔。 MIN_BALANCE, DEFAULT_DATE
循環(huán)計數(shù)器 通常采用字母 i,j,k 或者 counter 都可以接受。 i, j, k, counter
數(shù)組 數(shù)組應(yīng)該總是用下面的方式來命名:objectType[]。 byte[] buffer;
?
?
?
2. Java 注釋約定
?
一個很好的可遵循的有關(guān)注釋的經(jīng)驗法則是:問問你自己,你如果從未見過這段代碼,要在合理的時間內(nèi)有效地明白這段代碼,你需要哪些信息。
?
2.1. 一般概念
?
n 注釋應(yīng)該增加代碼的清晰度
n 保持注釋的簡潔
n 在寫代碼之前寫注釋
n 注釋出為什么做了一些事,而不僅僅是做了什么
2.2. 示范
文檔注釋 在緊靠接口、類、成員函數(shù)和字段聲明的前面注釋它們。 /** 客戶:客戶是我們將服務(wù)和產(chǎn)品賣給的人或機(jī)構(gòu)。*/
C 語言風(fēng)格 采用 C 語言風(fēng)格的注釋去掉不再使用但你仍想保留的代碼。仍想保留是因為用戶萬一會改變想法,或者在調(diào)試過程中想讓它暫時失效。 /* 這部分代碼因為已被它之前的代碼取代,由 B.Gustafsson, 于 1999 年 6 月 4 日注釋掉。如果兩年之后還未使用,將其刪除。. . . (源代碼)*/
單行 在成員函數(shù)內(nèi)采用單行注釋,來說明業(yè)務(wù)邏輯、代碼段和暫時變量的聲明。注釋符"http://"后必須緊跟一個空格,然后才是注釋信息。 // 遵照 Sarek 的規(guī)定,給所有// 超過 $1000 的發(fā)貨單// 打 5% 的折扣。讓利活// 動于 1995年 2 月開始.
2.3. 注釋哪些部分
類 類的目的、即類所完成的功能,注釋出采用的不變量。
接口 設(shè)置接口的目的、它應(yīng)如何被使用以及如何不被使用。
成員函數(shù)注釋 對于設(shè)置與獲取成員函數(shù),在成員變量已有說明的情況下,可以不加注釋;普通成員函數(shù)要求說明完成什么功能,參數(shù)含義是什么返回什么; ?
普通成員函數(shù)內(nèi)部注釋 控制結(jié)構(gòu),代碼做了些什么以及為什么這樣做,處理順序等。
實參/參數(shù) 參數(shù)含義、及其它任何約束或前提條件
字段/屬性 字段描述
局部變量 無特別意義的情況下不加注釋
?
?
?
3. Java 文件樣式約定
?
所有的 Java(*.java) 文件都必須遵守如下的樣式規(guī)則:
1) 版權(quán)信息 ?
版權(quán)信息必須在 java 文件的開頭,比如: ?
/** * Copyright ? 2000 Shanghai XXX Co. Ltd. * All right reserved. */
其他不需要出現(xiàn)在 javadoc 的信息也可以包含在這里。
2) Package/Imports ?
package 行要在 import 行之前,import 中標(biāo)準(zhǔn)的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應(yīng)該用 * 來處理。 ?
package hotlava.net.stats;import java.io.*;import java.util.Observable;import hotlava.util.Application;
這里 java.io.* 是用來代替InputStream and OutputStream 的。
3) Class ?
接下來的是類的注釋,一般是用來解釋類的。 ?
/** * A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */
接下來是類定義,包含了在不同的行的 extends 和 implements ?
public class CounterSet extends Observable implements Cloneable{……}
4) Class Fields ?
接下來是類的成員變量: ?
/** * Packet counters */protected int[] packets;
public 的成員變量必須生成文檔(JavaDoc)。proceted、private和 package 定義的成員變量如果名字含義明確的話,可以沒有注釋。
5) 存取方法(類的設(shè)置與獲取成員函數(shù))
接下來是類變量的存取的方法。它只是簡單的用來將類的變量賦值獲取值的話,可以簡單的寫在一行上,如類的成員變量已經(jīng)有注釋,類變量的存取方法可以沒有注釋。
public int[] getPackets() { return this.packets; }public void setPackets(int[] packets) { this.packets = packets; }……
要求說明的是,對于集合,加入成員函數(shù)來插入和刪除項;另其它的方法不要寫在一行上。
6) 構(gòu)造函數(shù) ?
接下來是構(gòu)造函數(shù),它應(yīng)該用遞增的方式寫(比如:參數(shù)多的寫在后面)。 ?
public CounterSet(int size){ this.size = size;}
7) 克隆方法 ?
如果這個類是可以被克隆的,那么下一步就是 clone 方法: ?
public Object clone() { try { …… }catch(CloneNotSupportedException e) { …… }}
8) 類方法 (類的普通成員函數(shù))
下面開始寫類的方法:
/** * Set the packet counters * param r1 - …… * param r2 - …… * …… */protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4) throws IllegalArgumentException{ // Ensure the arrays are of equal size ……}
9) toString 方法 ?
一般情況下,每一個類都應(yīng)該定義 toString 方法: ?
public String toString() { ……}
10) main 方法 ?
普通類,考慮置入一個main()方法,其中包含用于測試那個類的代碼,如果包含了main() 方法, 那么它應(yīng)該寫在類的底部。
?
?
?
4. Java編碼其它約定
?
n 文檔化 ?
必須用 javadoc 來為類生成文檔。不僅因為它是標(biāo)準(zhǔn),這也是被各種 java 編譯器都認(rèn)可的方法。使用 @author 標(biāo)記是不被推薦的,因為代碼不應(yīng)該是被個人擁有的。 ?
n 縮進(jìn) ?
縮進(jìn)應(yīng)該是每行2個空格。 不要在源文件中保存Tab字符, 在使用不同的源代碼管理工具時Tab字符將因為用戶設(shè)置的不同而擴(kuò)展為不同的寬度。 ?
如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字符, 方法是通過 UltrEdit中先設(shè)定 Tab 使用的長度室2個空格,然后用 Format|Tabs to Spaces 菜單將 Tab 轉(zhuǎn)換為空格。 ?
n 頁寬 ?
頁寬應(yīng)該設(shè)置為80字符。 源代碼一般不會超過這個寬度, 并導(dǎo)致無法完整顯示, 但這一設(shè)置也可以靈活調(diào)整。 在任何情況下, 超長的語句應(yīng)該在一個逗號或者一個操作符后折行。 一條語句折行后, 應(yīng)該比原來的語句再縮進(jìn)2個字符。
n {} 對 ?
{} 中的語句應(yīng)該單獨作為一行。 例如, 下面的第1行是錯誤的, 第2行是正確的: ?
if (i>0) { i ++ }; // 錯誤, { 和 } 在同一行 if (i>0) { i ++ }; // 正確, 單獨作為一行 ?
n 括號 ?
左括號和后一個字符之間不應(yīng)該出現(xiàn)空格; 同樣, 右括號和前一個字符之間也不應(yīng)該出現(xiàn)空格。 下面的例子說明括號和空格的錯誤及正確使用: ?
CallProc( AParameter ); // 錯誤 ?
CallProc(AParameter); // 正確 ?
不要在語句中使用無意義的括號,括號只應(yīng)該為達(dá)到某種目的而出現(xiàn)在源代碼中。
n JSP文件命名
采用完整的英文描述說明JSP所完成的功能,盡可能包括一個生動的動詞,第一個字母小寫,如:viewMessage.jsp、editUser.jsp或者forumChooser.jsp等。
n Servlet類命名
一般對應(yīng)于所服務(wù)的對象加后綴Service來命名,如:UserService,TradeService等。
?
?
?
5. 一些編程建議
?
n 使用 StringBuffer 對象 ?
在處理 String 的時候要盡量使用 StringBuffer 類,StringBuffer 類是構(gòu)成 String 類的基礎(chǔ)。String 類將 StringBuffer 類封裝了起來,(以花費(fèi)更多時間為代價)為開發(fā)人員提供了一個安全的接口。當(dāng)我們在構(gòu)造字符串的時候,我們應(yīng)該用 StringBuffer 來實現(xiàn)大部分的工作,當(dāng)工作完成后將 StringBuffer 對象再轉(zhuǎn)換為需要的 String 對象。比如:如果有一個字符串必須不斷地在其后添加許多字符來完成構(gòu)造,那么我們應(yīng)該使用 StringBuffer 對象和它的 append() 方法。如果我們用 String 對象代替 StringBuffer 對象的話,會花費(fèi)許多不必要的創(chuàng)建和釋放對象的 CPU 時間。
n 避免太多的使用 synchronized 關(guān)鍵字 ?
避免不必要的使用關(guān)鍵字 synchronized,應(yīng)該在必要的時候再使用它,這是一個避免死鎖的好方法。 必須使用時,也盡量控制范圍,最好在塊級控制。
n 避免使用 java.util.Vector 類
因為"Unlike the new collection implementations, Vector is synchronized.",所以使用java.util.Vector類在性能上會有所減低。
n 盡量使用接口而不是一個具體的類
比方如下需求,給定一個SQL語句,返回一個對象的列表,實現(xiàn)中用java.util.ArrayList實現(xiàn),于是定義方法為:
public java.util.ArrayList getObjectItems(String sql)
上面的方法存在一個問題,當(dāng)getObjectItems內(nèi)改用Vector或LinkedList實現(xiàn),外部類必須做相應(yīng)更改。一個更好的方法是定義返回值為java.util.AbstractList更合適:
public java.util.AbstractList getObjectItems(String sql)
這樣即使更改實現(xiàn),外部類也不必做相應(yīng)更改。
n 避免使用索引來調(diào)用數(shù)據(jù)庫中間層組件返回的結(jié)果集
如:
for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, 0).toString(); ……}
而應(yīng)用字段名來存取結(jié)果集:
for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, "field1").toString(); ……}
這樣在數(shù)據(jù)庫設(shè)計更改或查詢的SQL語句發(fā)生變化時,不會影響到程序的執(zhí)行。
?
?
?
?
作者:酷頁 來源:InterNet 加入時間:2003-7-24? ?
?
?
1. Java 命名約定
?
除了以下幾個特例之外,命名時應(yīng)始終采用完整的英文描述符。此外,一般應(yīng)采用小寫字母,但類名、接口名以及任何非初始單詞的第一個字母要大寫。
1.1 一般概念
?
n 盡量使用完整的英文描述符
n 采用適用于相關(guān)領(lǐng)域的術(shù)語
n 采用大小寫混合使名字可讀
n 盡量少用縮寫,但如果用了,要明智地使用,且在整個工程中統(tǒng)一
n 避免使用長的名字(小于 15 個字母是個好主意)
n 避免使用類似的名字,或者僅僅是大小寫不同的名字
n 避免使用下劃線(除靜態(tài)常量等)
?
1.2 示范
?
包(Package) 采用完整的英文描述符,應(yīng)該都是由小寫字母組成。對于全局包,將你的 Internet 域名反轉(zhuǎn)并接上包名。 java.awt,com.ambysoft.www.persistence
類(Class) 采用完整的英文描述符,所有單詞的第一個字母大寫。 Customer, SavingsAccount
接口(Interface) 采用完整的英文描述符說明接口封裝,所有單詞的第一個字母大寫。習(xí)慣上,名字后面加上后綴 able, ible 或者 er,但這不是必需的。 Contactable,Prompter
組件/部件(Component) 使用完整的英文描述來說明組件的用途,末端應(yīng)接上組件類型。 okButton, customerList,fileMenu
異常(Exception) 通常采用字母 e 表示異常。 e ?
類變量 字段采用完整的英文描述,第一個字母小寫,任何中間單詞的首字母大寫。 firstName, lastName
實參/參數(shù) 同字段/屬性的命名規(guī)則 public void setFirstName(String firstName){ this.firstName = firstName;}
局部變量 同字段/屬性的命名規(guī)則 ?
獲取成員函數(shù) 被訪問字段名的前面加上前綴 get。 getFirstName(), getLastName()
布爾型的獲取成員函數(shù) 所有的布爾型獲取函數(shù)必須用單詞 is 做前綴。 isPersistent(), isString()
設(shè)置成員函數(shù) 被訪問字段名的前面加上前綴 set。 setFirstName(), setLastName(),setWarpSpeed()
普通成員函數(shù) 采用完整的英文描述說明成員函數(shù)功能,第一個單詞盡可能采用一個生動的動詞,第一個字母小寫。 openFile(), addAccount()
靜態(tài)常量字段(static final) 全部采用大寫字母,單詞之間用下劃線分隔。 MIN_BALANCE, DEFAULT_DATE
循環(huán)計數(shù)器 通常采用字母 i,j,k 或者 counter 都可以接受。 i, j, k, counter
數(shù)組 數(shù)組應(yīng)該總是用下面的方式來命名:objectType[]。 byte[] buffer;
?
?
?
2. Java 注釋約定
?
一個很好的可遵循的有關(guān)注釋的經(jīng)驗法則是:問問你自己,你如果從未見過這段代碼,要在合理的時間內(nèi)有效地明白這段代碼,你需要哪些信息。
?
2.1. 一般概念
?
n 注釋應(yīng)該增加代碼的清晰度
n 保持注釋的簡潔
n 在寫代碼之前寫注釋
n 注釋出為什么做了一些事,而不僅僅是做了什么
2.2. 示范
文檔注釋 在緊靠接口、類、成員函數(shù)和字段聲明的前面注釋它們。 /** 客戶:客戶是我們將服務(wù)和產(chǎn)品賣給的人或機(jī)構(gòu)。*/
C 語言風(fēng)格 采用 C 語言風(fēng)格的注釋去掉不再使用但你仍想保留的代碼。仍想保留是因為用戶萬一會改變想法,或者在調(diào)試過程中想讓它暫時失效。 /* 這部分代碼因為已被它之前的代碼取代,由 B.Gustafsson, 于 1999 年 6 月 4 日注釋掉。如果兩年之后還未使用,將其刪除。. . . (源代碼)*/
單行 在成員函數(shù)內(nèi)采用單行注釋,來說明業(yè)務(wù)邏輯、代碼段和暫時變量的聲明。注釋符"http://"后必須緊跟一個空格,然后才是注釋信息。 // 遵照 Sarek 的規(guī)定,給所有// 超過 $1000 的發(fā)貨單// 打 5% 的折扣。讓利活// 動于 1995年 2 月開始.
2.3. 注釋哪些部分
類 類的目的、即類所完成的功能,注釋出采用的不變量。
接口 設(shè)置接口的目的、它應(yīng)如何被使用以及如何不被使用。
成員函數(shù)注釋 對于設(shè)置與獲取成員函數(shù),在成員變量已有說明的情況下,可以不加注釋;普通成員函數(shù)要求說明完成什么功能,參數(shù)含義是什么返回什么; ?
普通成員函數(shù)內(nèi)部注釋 控制結(jié)構(gòu),代碼做了些什么以及為什么這樣做,處理順序等。
實參/參數(shù) 參數(shù)含義、及其它任何約束或前提條件
字段/屬性 字段描述
局部變量 無特別意義的情況下不加注釋
?
?
?
3. Java 文件樣式約定
?
所有的 Java(*.java) 文件都必須遵守如下的樣式規(guī)則:
1) 版權(quán)信息 ?
版權(quán)信息必須在 java 文件的開頭,比如: ?
/** * Copyright ? 2000 Shanghai XXX Co. Ltd. * All right reserved. */
其他不需要出現(xiàn)在 javadoc 的信息也可以包含在這里。
2) Package/Imports ?
package 行要在 import 行之前,import 中標(biāo)準(zhǔn)的包名要在本地的包名之前,而且按照字母順序排列。如果 import 行中包含了同一個包中的不同子目錄,則應(yīng)該用 * 來處理。 ?
package hotlava.net.stats;import java.io.*;import java.util.Observable;import hotlava.util.Application;
這里 java.io.* 是用來代替InputStream and OutputStream 的。
3) Class ?
接下來的是類的注釋,一般是用來解釋類的。 ?
/** * A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */
接下來是類定義,包含了在不同的行的 extends 和 implements ?
public class CounterSet extends Observable implements Cloneable{……}
4) Class Fields ?
接下來是類的成員變量: ?
/** * Packet counters */protected int[] packets;
public 的成員變量必須生成文檔(JavaDoc)。proceted、private和 package 定義的成員變量如果名字含義明確的話,可以沒有注釋。
5) 存取方法(類的設(shè)置與獲取成員函數(shù))
接下來是類變量的存取的方法。它只是簡單的用來將類的變量賦值獲取值的話,可以簡單的寫在一行上,如類的成員變量已經(jīng)有注釋,類變量的存取方法可以沒有注釋。
public int[] getPackets() { return this.packets; }public void setPackets(int[] packets) { this.packets = packets; }……
要求說明的是,對于集合,加入成員函數(shù)來插入和刪除項;另其它的方法不要寫在一行上。
6) 構(gòu)造函數(shù) ?
接下來是構(gòu)造函數(shù),它應(yīng)該用遞增的方式寫(比如:參數(shù)多的寫在后面)。 ?
public CounterSet(int size){ this.size = size;}
7) 克隆方法 ?
如果這個類是可以被克隆的,那么下一步就是 clone 方法: ?
public Object clone() { try { …… }catch(CloneNotSupportedException e) { …… }}
8) 類方法 (類的普通成員函數(shù))
下面開始寫類的方法:
/** * Set the packet counters * param r1 - …… * param r2 - …… * …… */protected final void setArray(int[] r1, int[] r2, int[] r3, int[] r4) throws IllegalArgumentException{ // Ensure the arrays are of equal size ……}
9) toString 方法 ?
一般情況下,每一個類都應(yīng)該定義 toString 方法: ?
public String toString() { ……}
10) main 方法 ?
普通類,考慮置入一個main()方法,其中包含用于測試那個類的代碼,如果包含了main() 方法, 那么它應(yīng)該寫在類的底部。
?
?
?
4. Java編碼其它約定
?
n 文檔化 ?
必須用 javadoc 來為類生成文檔。不僅因為它是標(biāo)準(zhǔn),這也是被各種 java 編譯器都認(rèn)可的方法。使用 @author 標(biāo)記是不被推薦的,因為代碼不應(yīng)該是被個人擁有的。 ?
n 縮進(jìn) ?
縮進(jìn)應(yīng)該是每行2個空格。 不要在源文件中保存Tab字符, 在使用不同的源代碼管理工具時Tab字符將因為用戶設(shè)置的不同而擴(kuò)展為不同的寬度。 ?
如果你使用 UltrEdit 作為你的 Java 源代碼編輯器的話,你可以通過如下操作來禁止保存Tab字符, 方法是通過 UltrEdit中先設(shè)定 Tab 使用的長度室2個空格,然后用 Format|Tabs to Spaces 菜單將 Tab 轉(zhuǎn)換為空格。 ?
n 頁寬 ?
頁寬應(yīng)該設(shè)置為80字符。 源代碼一般不會超過這個寬度, 并導(dǎo)致無法完整顯示, 但這一設(shè)置也可以靈活調(diào)整。 在任何情況下, 超長的語句應(yīng)該在一個逗號或者一個操作符后折行。 一條語句折行后, 應(yīng)該比原來的語句再縮進(jìn)2個字符。
n {} 對 ?
{} 中的語句應(yīng)該單獨作為一行。 例如, 下面的第1行是錯誤的, 第2行是正確的: ?
if (i>0) { i ++ }; // 錯誤, { 和 } 在同一行 if (i>0) { i ++ }; // 正確, 單獨作為一行 ?
n 括號 ?
左括號和后一個字符之間不應(yīng)該出現(xiàn)空格; 同樣, 右括號和前一個字符之間也不應(yīng)該出現(xiàn)空格。 下面的例子說明括號和空格的錯誤及正確使用: ?
CallProc( AParameter ); // 錯誤 ?
CallProc(AParameter); // 正確 ?
不要在語句中使用無意義的括號,括號只應(yīng)該為達(dá)到某種目的而出現(xiàn)在源代碼中。
n JSP文件命名
采用完整的英文描述說明JSP所完成的功能,盡可能包括一個生動的動詞,第一個字母小寫,如:viewMessage.jsp、editUser.jsp或者forumChooser.jsp等。
n Servlet類命名
一般對應(yīng)于所服務(wù)的對象加后綴Service來命名,如:UserService,TradeService等。
?
?
?
5. 一些編程建議
?
n 使用 StringBuffer 對象 ?
在處理 String 的時候要盡量使用 StringBuffer 類,StringBuffer 類是構(gòu)成 String 類的基礎(chǔ)。String 類將 StringBuffer 類封裝了起來,(以花費(fèi)更多時間為代價)為開發(fā)人員提供了一個安全的接口。當(dāng)我們在構(gòu)造字符串的時候,我們應(yīng)該用 StringBuffer 來實現(xiàn)大部分的工作,當(dāng)工作完成后將 StringBuffer 對象再轉(zhuǎn)換為需要的 String 對象。比如:如果有一個字符串必須不斷地在其后添加許多字符來完成構(gòu)造,那么我們應(yīng)該使用 StringBuffer 對象和它的 append() 方法。如果我們用 String 對象代替 StringBuffer 對象的話,會花費(fèi)許多不必要的創(chuàng)建和釋放對象的 CPU 時間。
n 避免太多的使用 synchronized 關(guān)鍵字 ?
避免不必要的使用關(guān)鍵字 synchronized,應(yīng)該在必要的時候再使用它,這是一個避免死鎖的好方法。 必須使用時,也盡量控制范圍,最好在塊級控制。
n 避免使用 java.util.Vector 類
因為"Unlike the new collection implementations, Vector is synchronized.",所以使用java.util.Vector類在性能上會有所減低。
n 盡量使用接口而不是一個具體的類
比方如下需求,給定一個SQL語句,返回一個對象的列表,實現(xiàn)中用java.util.ArrayList實現(xiàn),于是定義方法為:
public java.util.ArrayList getObjectItems(String sql)
上面的方法存在一個問題,當(dāng)getObjectItems內(nèi)改用Vector或LinkedList實現(xiàn),外部類必須做相應(yīng)更改。一個更好的方法是定義返回值為java.util.AbstractList更合適:
public java.util.AbstractList getObjectItems(String sql)
這樣即使更改實現(xiàn),外部類也不必做相應(yīng)更改。
n 避免使用索引來調(diào)用數(shù)據(jù)庫中間層組件返回的結(jié)果集
如:
for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, 0).toString(); ……}
而應(yīng)用字段名來存取結(jié)果集:
for(int i=1; i<=dt.getRowCount(); i++){ String field1 = dt.getField(i, "field1").toString(); ……}
這樣在數(shù)據(jù)庫設(shè)計更改或查詢的SQL語句發(fā)生變化時,不會影響到程序的執(zhí)行。
?
?