(1) 避免使用NEW關鍵字來創建String對象
把一個String常量copy到String 對象中通常是多余、浪費時間的。
Public class test{ Public void method(){ System.out.print (str); } private String str = new String ("1"); //這里新建對象是完全沒有必要的 private String str2=”2” //正確的應該如此 } |
(2) 避免使用不必要的嵌套
過多的嵌套會使你的代碼復雜化,減弱可讀性。
Public class test { String add (){ Int c=(a=a+b)+b; //過于復雜 Return c } } |
(3) 避免在同一行聲明不同類型的多個變量
這樣可以使程序更加清晰,避免混亂
private int index, index1[]; |
正確的應該如此:
private int index; private int index1[]; |
(4) 在每一行里寫一條語句
這條規則不包括for語句:比如:'for (int i = 0; i < 10; i++) x--;’可以增加代碼的可讀性。
public class OSPL { int method (int a, int b) { int i = a + b; return i; // 可讀性不強 } |
正確的:
public class OSPLFixed { int method (int a, int b) { int i = a + b; return i; } } |
(5)經常從finalize ()中調用super.finalize ()
這里的finalize ()是java在進行垃圾收集的時候調用的,和finally不一樣。如果你的父類沒有定義finally()的話,你也應該調用。這里有兩個原因:(1)在不改變代碼的情況下能夠將父類的finally方法加到你的類中。 (2)以后你會養成習慣調用父類的finally方法,即使父類沒有定義finally方法的時候。
正確的方法應該如此:
public class parentFinalize { protected void finalize () throws Throwable { super.finalize(); // FIXED } |
(6) 不要在finalize ()中注銷listeners
不要再finalize ()方法中中注銷listeners,finalize ()只有再沒有對象引用的時候調用,如果listeners從finalize()方法中去除了,被finalize的對象將不會在垃圾收集中去除。
public void finalize () throws Throwable { bButton.removeActionListener (act); } |
(7) 不要顯式的調用finalize ()方法
雖然顯式的調用這個方法可以使你確保你的調用,但是當這個方法收集了以后垃圾收集會再收集一次。
public class T7 { public void finalize() throws Throwable { close_resources (); super.finalize (); } public void close_resources() {} } class Test { void cleanup () throws Throwable { t71.finalize(); // 調用 t71 = null; } private t71 = new T7 (); } |
對于這樣的調用我們應該自己創建一個釋放的方法,做最初finalize ()所作的事情,當你每次想顯式的調用finalize ()的時候實際上調用了釋放方法。然后再使用一個判斷字段來確保這個方法只執行一次,以后再調用就沒關系了。
public class T7 { public synchronized void release () throws Throwable{ if (!_released) { close_resources (); // do what the old 'finalize ()' did _released = true; } } public void finalize () throws Throwable { release (); super.finalize (); } public void close_resources() {} private boolean _released = false; } class TestFixed { void closeTest () throws Throwable { t71 .release (); // FIXED t71 = null; } private T7 t71 = new T7 (); } |
(8)不要使用不推薦的API
盡量使用JDK1.3推薦的API。在類和方法或者java組件里有很多方法是陳舊的或者是可以選擇的。有一些方法SUN用了"deprecated“標記。最好不要使用例如:
private List t_list = new List (); t_list.addItem (str); |
如果查一下javadoc的話,會發現建議用add()來代替addItem()。
(9)為所有序列化的類創建一個'serialVersionUID'
可以避免從你各種不同的類破壞序列的兼容性。如果你不特別制訂一個UID的話,那么系統為自動產生一個UID(根據類的內容)。如果UID在你新版本的類中改變了,即使那個被序列化的類沒改變,你也不能反序列化老的版本了。
public class DUID implements java.io.Serializable { public void method () {}} |
在里面加一個UID,當這個類的序列化形式改變的時候,你也改變這個UID就可以了。
public class DUIDFixed implements java.io.Serializable { public void method () {} private static final long serialVersionUID = 1; } |
(10)對于private常量的定義
比較好的做法是對于這樣的常量,加上final標記,這樣的常量從初始化到最后結束值都不會改變。
private int size = 5; |
改變后的做法是:
private final int size = 5; |
(11)避免把方法本地變量和參數定義成和類變量相同的名字
這樣容易引起混擾,建議把任何的變量字都定義成唯一的。這樣看來,SCJP里的那些題目在現實中就用不到了:)
public void method (int j) { final int i = 5; // VIOLATION } private int j = 2; |
建議:
public void method (int j1) { final int i = 5; // VIOLATION } private int j = 2; |