《編寫高質量程式碼:改善Java程式的151個建議》筆記

jeepc發表於2018-10-10
  • 1、不要在常量和變數中出現易混淆的字母。比如長整型不要用小寫l,而是用大寫L。
  • 2、莫讓常量蛻變成變數。比如不要:public static fnal int RAND_CONST= new + Random().nextInt();
  • 3、三元操作符的型別務必一致。
  • 4、避免帶有可變引數的方法過載。
  • 5、別讓null值和空值威脅到變長方法。第4點和第5點類似,比如void foo(arg1)和void foo(…arg1),當我們只傳入一個引數時可能會呼叫到非預期的方法,而當我們傳入null會導致編譯不通過。
  • 6、覆寫方法開閉原則:重寫方法不能縮小訪問許可權。 引數列表必須與被重寫方法相同; 返回型別必須與被重寫方法的相同或是其子類; 重寫方法不能丟擲新的異常,或者超出父類範圍的異常,但是可以丟擲更少、更有限的異常,或者不丟擲異常。
  • 7、警惕自增的陷阱。注意先++還是後++,更要避免錯誤寫法:count=count++。
  • 8、不要讓舊語法困擾你。
  • 9、少用靜態匯入。建議“類名.靜態變數",這樣可讀性更強。
  • 10、不要在本類中覆蓋靜態匯入的變數和方法。關於這一點減少靜態匯入就完事了。
  • 11、養成良好習慣,顯式宣告UID。用IDE自動生成就完事了。
  • 12、避免用序列化類在建構函式中為不變數賦值。反序列化時不會執行賦值的那個建構函式。
  • 13、避免為final變數複雜賦值。比如:
public class Person implements Serializable{
    private static final long serialVersionUID=91282334L;
    //通過方法返回值為final變數賦值
    public fnal String name=initName();
    //初始化方法名
    public String initName(){
        return"混世魔王";
    }
} 
複製程式碼

反序列化時不會為name重新呼叫initName方法賦值。

  • 14、使用序列化類的私有方法巧妙解決部分屬性持久化問題
  • 15、break萬萬不可忘。這一點經常犯的自行面壁。
  • 16、易變業務使用指令碼語言編寫。
  • 17、慎用動態編譯。
  • 18、避免instanceof非預期結果。 //在編譯成位元組碼的時間T是Object型別
class  GenericClass<T>{
    public boolean isDateInstance(T t){
        return t instanceof  Date;
    }
}
boolean b = new GenericClass<String>().isDateInstance("");//false
複製程式碼
  • 19、斷言絕對不是雞肋。
  • 20、不要只替換一個類。舉例:一個類引用了Constant類的常量,改變Constant類的常量值,這個類沒有相應改變,我們在web部署時要把所有類都替換掉。通常IDE會幫我們解決這個問題。
  • 21、用偶判斷,不用奇判斷。比如-1%2=-1。
  • 22、用整數型別處理貨幣。因為Java中浮點數有些不能被準確表示(可以試一下System.out.println(0.1*3))。解決方案:1、使用BigDecimal;2、使用整型,先擴大再縮小。
  • 23、不要讓型別默默轉換。
public static final int LIGHT_SPEED=30*10000*1000;
long dis2=LIGHT_SPEED*60*8;//結果為-2028888064,原因:Java先運算再進行型別轉換,
                              此時int越界,最好將LIGHT_SPEED直接宣告為L。
複製程式碼
  • 24、邊界,邊界,還是邊界。
public final static int LIMIT=2000;
if(order>0&&order+1000<=LIMIT){
    System.out.println("你已經成功預定的"+order+"個產品!");//當order==2147483647(int最大值)時,
                                                            雖然遠大於2000,但是這個判斷條件還是會
                                                            成立,原因是已經越界變成負數了。
}
複製程式碼
  • 25、不要讓四捨五入虧了一方。銀行家舍入(Banker's Round)的近似演算法:當捨去位的數值等於5時,分兩種情況:5後面還有其他數字(非0),則進位後捨去;若5後面是0(即5是最後一個數字),則根據5前一位數的奇偶性來判斷是否需要進位,奇數進位,偶數捨去。
  • 26、提防包裝型別的null值。
  • 27、謹慎包裝型別的大小比較。
Integer i=new Integer(100);
Integer j=new Integer(100);
System.out.println(i==j);//false,比較引用地址
System.out.println(i>j);//false,比較intValue(),此時它們是相等的
System.out.println(i<j);
複製程式碼
  • 28、優先使用整型池。
  • 29、優先選擇基本型別。
  • 30、不要隨便設定隨機種子。在Java中,隨機數的產生取決於種子,隨機數和種子之間的關係遵從以下兩個規則: 種子不同,產生不同的隨機數。 種子相同,即使例項不同也產生相同的隨機數。

相關文章