FileOutputStream fos = new FileOutputStream(projectFile);
project.save(fos, "IDE Project File");
fos.close();
Clone 下面是一種有用的方法:
implements Cloneable
public
Object clone()
{
try {
ThisClass obj = (ThisClass)super.clone();
obj.field1 = (int[])field1.clone();
obj.field2 = field2;
return obj;
} catch(CloneNotSupportedException e) {
throw new InternalError("Unexpected CloneNotSUpportedException: " + e.getMessage());
} }
final 類
絕對不要因為性能的原因將類定義為 final 的(除非程序的框架要求)
如果一個類還沒有準備好被繼承,最好在類文檔中注明,而不要將她定義為 final 的。這是因為沒有人可以保證會不會由于什么原因需要繼承她。
訪問類的成員變量
大部分的類成員變量應該定義為 protected 的來防止繼承類使用他們。
注意,要用"int[] packets",而不是"int packets[]",后一種永遠也不要用。
public void setPackets(int[] packets) { this.packets = packets; }
CounterSet(int size)
{
this.size = size;
}
編程技巧
byte 數組轉換到 characters
為了將 byte 數組轉換到 characters,你可以這么做:
"Hello world!".getBytes();
Utility 類
Utility 類(僅僅提供方法的類)應該被申明為抽象的來防止被繼承或被初始化。
初始化
下面的代碼是一種很好的初始化數組的方法:
objectArguments = new Object[] { arguments };
枚舉類型
JAVA 對枚舉的支持不好,但是下面的代碼是一種很有用的模板:
class Colour {
public static final Colour BLACK = new Colour(0, 0, 0);
public static final Colour RED = new Colour(0xFF, 0, 0);
public static final Colour GREEN = new Colour(0, 0xFF, 0);
public static final Colour BLUE = new Colour(0, 0, 0xFF);
public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);
}
這種技術實現了RED, GREEN, BLUE 等可以象其他語言的枚舉類型一樣使用的常量。 他們可以用 == 操作符來比較。但是這樣使用有一個缺陷:如果一個用戶用這樣的方法來創建顏色 BLACK
new Colour(0,0,0)
那么這就是另外一個對象,==操作符就會產生錯誤。她的 equal() 方法仍然有效。由于這個原因,這個技術的缺陷最好注明在文檔中,或者只在自己的包中使用。
Swing
避免使用 AWT 組件
混合使用 AWT 和 Swing 組件
如果要將 AWT 組件和 Swing 組件混合起來使用的話,請小心使用。實際上,盡量不要將他們混合起來使用。
滾動的 AWT 組件
AWT 組件絕對不要用 JscrollPane 類來實現滾動。滾動 AWT 組件的時候一定要用 AWT ScrollPane 組件來實現。
避免在 InternalFrame 組件中使用 AWT 組件
盡量不要這么做,要不然會出現不可預料的后果。
Z-Order 問題
AWT 組件總是顯示在 Swing 組件之上。當使用包含 AWT 組件的 POP-UP 菜單的時候要小心,盡量不要這樣使用。
調試
調試在軟件開發中是一個很重要的部分,存在軟件生命周期的各個部分中。調試能夠用配置開、關是最基本的。
很常用的一種調試方法就是用一個 PrintStream 類成員,在沒有定義調試流的時候就為 null,類要定義一個 debug 方法來設置調試用的流。
性能
在寫代碼的時候,從頭至尾都應該考慮性能問題。這不是說時間都應該浪費在優化代碼上,而是我們時刻應該提醒自己要注意代碼的效率。比如:如果沒有時間來實現一個高效的算法,那么我們應該在文檔中記錄下來,以便在以后有空的時候再來實現她。
不是所有的人都同意在寫代碼的時候應該優化性能這個觀點的,他們認為性能優化的問題應該在項目的后期再去考慮,也就是在程序的輪廓已經實現了以后。
不必要的對象構造
不要在循環中構造和釋放對象
使用 StringBuffer 對象
在處理 String 的時候要盡量使用 StringBuffer 類,StringBuffer 類是構成 String 類的基礎。String 類將 StringBuffer 類封裝了起來,(以花費更多時間為代價)為開發人員提供了一個安全的接口。當我們在構造字符串的時候,我們應該用 StringBuffer 來實現大部分的工作,當工作完成后將 StringBuffer 對象再轉換為需要的 String 對象。比如:如果有一個字符串必須不斷地在其后添加許多字符來完成構造,那么我們應該使用 StringBuffer 對象和她的 append() 方法。如果我們用 String 對象代替 StringBuffer 對象的話,會花費許多不必要的創建和釋放對象的 CPU 時間。
避免太多的使用 synchronized 關鍵字
避免不必要的使用關鍵字 synchronized,應該在必要的時候再使用她,這是一個避免死鎖的好方法。
可移植性
Borland Jbulider 不喜歡 synchronized 這個關鍵字,如果你的斷點設在這些關鍵字的作用域內的話,調試的時候你會發現的斷點會到處亂跳,讓你不知所措。除非必須,盡量不要使用。
換行
如果需要換行的話,盡量用 println 來代替在字符串中使用" "。
你不要這樣: System.out.print("Hello,world! ");
要這樣: System.out.println("Hello,world!");
或者你構造一個帶換行符的字符串,至少要象這樣: String newline = System.getProperty("line.separator");
System.out.println("Hello world" + newline);
PrintStream
PrintStream 已經被不贊成(deprecated)使用,用 PrintWrite 來代替她。
參考資料:查找有關 Thread 類和 Java 2 平臺,標準版,API 規范的其他方面的信息。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/