本文介紹的Java規則的說(shuō)明分為5個(gè)級別,級別1是最基本也是最重要的級別,在今后將陸續寫(xiě)出其他的規則。遵守了這些規則可以提高程序的效率、使代碼有更好的可讀性等。
(1) 避免使用NEW關(guān)鍵字來(lái)創(chuàng )建String對象
把一個(gè)String常量copy到String 對象中通常是多余、浪費時(shí)間的。
Public class test{
Public void method(){
System.out.print (str);
}
private String str = new String ("1"); //這里新建對象是完全沒(méi)有必要的
private String str2=”2” //正確的應該如此
}
2) 避免使用不必要的嵌套
過(guò)多的嵌套會(huì )使你的代碼復雜化,減弱可讀性。
Public class test {
String add (){
Int c=(a=a+b)+b; //過(guò)于復雜
Return c
}
}
(3) 避免在同一行聲明不同類(lèi)型的多個(gè)變量
這樣可以使程序更加清晰,避免混亂
private int index, index1[];
正確的應該如此:
private int index;
private int index1[];
(4) 在每一行里寫(xiě)一條語(yǔ)句
這條規則不包括for語(yǔ)句:比如:‘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)經(jīng)常從finalize ()中調用super.finalize ()
這里的finalize ()是java在進(jìn)行垃圾收集的時(shí)候調用的,和finally不一樣。如果你的父類(lèi)沒(méi)有定義finally()的話(huà),你也應該調用。這里有兩個(gè)原因:(1)在不改變代碼的情況下能夠將父類(lèi)的finally方法加到你的類(lèi)中。 (2)以后你會(huì )養成習慣調用父類(lèi)的finally方法,即使父類(lèi)沒(méi)有定義finally方法的時(shí)候。
正確的方法應該如此:
public class parentFinalize {
protected void finalize () throws Throwable {
super.finalize(); // FIXED
}
(6) 不要在finalize ()中注銷(xiāo)listeners
不要再finalize ()方法中中注銷(xiāo)listeners,finalize ()只有再沒(méi)有對象引用的時(shí)候調用,如果listeners從finalize()方法中去除了,被finalize的對象將不會(huì )在垃圾收集中去除。
public void finalize () throws Throwable {
bButton.removeActionListener (act);
}
(7) 不要顯式的調用finalize ()方法
雖然顯式的調用這個(gè)方法可以使你確保你的調用,但是當這個(gè)方法收集了以后垃圾收集會(huì )再收集一次。
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 ();
}
對于這樣的調用我們應該自己創(chuàng )建一個(gè)釋放的方法,做最初finalize ()所作的事情,當你每次想顯式的調用finalize ()的時(shí)候實(shí)際上調用了釋放方法。然后再使用一個(gè)判斷字段來(lái)確保這個(gè)方法只執行一次,以后再調用就沒(méi)關(guān)系了。
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
在類(lèi)和方法或者java組件里有很多方法是陳舊的或者是可以選擇的。有一些方法SUN用了"deprecated“標記。最好不要使用例如:
private List t_list = new List ();
t_list.addItem (str);
如果查一下javadoc的話(huà),會(huì )發(fā)現建議用add()來(lái)代替addItem()。
(9)為所有序列化的類(lèi)創(chuàng )建一個(gè)‘serialVersionUID‘
可以避免從你各種不同的類(lèi)破壞序列的兼容性。如果你不特別制訂一個(gè)UID的話(huà),那么系統為自動(dòng)產(chǎn)生一個(gè)UID(根據類(lèi)的內容)。如果UID在你新版本的類(lèi)中改變了,即使那個(gè)被序列化的類(lèi)沒(méi)改變,你也不能反序列化老的版本了。
public class DUID implements java.io.Serializable { public void method () {}}
在里面加一個(gè)UID,當這個(gè)類(lèi)的序列化形式改變的時(shí)候,你也改變這個(gè)UID就可以了。
public class DUIDFixed implements java.io.Serializable {
public void method () {}
private static final long serialVersionUID = 1;
}
(10)對于private常量的定義
比較好的做法是對于這樣的常量,加上final標記,這樣的常量從初始化到最后結束值都不會(huì )改變。
private int size = 5;
改變后的做法是:
private final int size = 5;
(11)避免把方法本地變量和參數定義成和類(lèi)變量相同的名字
這樣容易引起混擾,建議把任何的變量字都定義成唯一的。這樣看來(lái),SCJP里的那些題目在現實(shí)中就用不到了:)
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;
來(lái)源: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1405037