如何提高Java程式碼質量-優雅的寫程式碼

weixin_33924312發表於2018-08-28

寫在前面的話:

  • 先讓程式碼跑起來再考慮優化,警惕過早優化程式碼
  • 程式碼review很重要
  • 閱讀程式碼的時間比寫程式碼的時間多得多

應該注意的規範

  • 所有檔案的開頭都要有Java文件的註釋

  • 儘量使類中所有的變數都是私有的,只能通過方法來訪問它們

  • 常量應該全部大寫,單詞之間由下劃線分隔(例如,MAX_WORK_HOURS)

  • 一行應該包含一個語句

  • 在使用if-else、for、while、do和switch語句時應該使用大括號

  • 避免一行中超過80個字元

  • 陣列標識:要用"int[] packets",而不是"int packets[]",後一種永遠也不要用

  • 不要在迴圈中構造和釋放物件

  • 在任何可能的地方讓類為Final,標記為final的類不能被擴充套件

  • 在任何可能的地方使用區域性變數,屬於方法呼叫部分的自變數和宣告為此呼叫一部分的臨時變數儲存在棧中

  • 用程式碼有效處理記憶體溢位,OutOfMemoryError是由於記憶體不夠後普遍會遇到的問題

  • 儘量使用懶載入,即在需要時才建立

  • try...catch只允許包裹當前會丟擲異常的程式碼塊,多餘的程式碼塊會影響資源回收。並且 try...catch 禁止在迴圈體內部使用

  • 集合如果能估計到待新增的內容長度,請指定容器的初始長度
    比如ArrayList、LinkedLlist、StringBuilder、StringBuffer、HashMap、HashSet

for迴圈的優化

//replace
for( int i = 0; i < collection.size(); i++) {
...
}
//with...
for( int i = 0, n = collection.size(); i < n; i++) {
...
}

迴圈儘量不要不斷建立物件引用,

//這種做法會導致記憶體中有count份Object物件引用存在,count很大的話,就耗費記憶體了
//replace
for (int i = 1; i <= count; i++){
    Object obj = new Object();    
}
//with...
Object obj =null;
for (int i = 1; i <= count; i++){
     obj = new Object();    
}

字串優化

String str1 = "str";
String str2 = "ing";
String str3 = "str" + "ing";//常量池中的物件
String str4 = str1 + str2; //在堆上建立的新的物件   
String str5 = "string";//常量池中的物件
System.out.println(str3 == str4);//false
System.out.println(str3 == str5);//true
System.out.println(str4 == str5);//false

//使用append代替+
//replace
String str = "profit = revenue( “ + revenue +
”) - cost( “ + cost + ”)";
//with
String str = new StringBuffer().append( "profit = revenue( “).
append( revenue).append( “) - cost( “).
append( cost).append( “)“).toString();

字串和字串常量equals的時候將字串常量寫在前面,能避免NPE

String str = "aac";
//replace
str.equals("aac");
//with
"123".equals(str);

使用常量

  1. 常量宣告為static final,並以大寫命名在編譯期間就可以把這些內容放入常量池中,避免執行期間計算生成常量的值。另外,將常量的名字以大寫命名也可以方便區分出常量與變數

  2. 同型別的多個常量請使用列舉

  3. 單一常量請使用 interface 宣告類包裹, interface 天生就是靜態公開的。

Spring 注入

Spring 注入方式注入請使用 Construction 方式進行注入,傳統的@Autowired注入方式容易產生 NPE 錯誤,因此 Spring 強烈建議使用 Construction 代替 Field 注入。如:

class Foo {
  //replace
  //@Autowired private SomeService someService;
  //with
  private final SomeService someService;

  @Autowired public Foo(SomeService someService) {
    this.someService = someService;
  }
}

未完待續 - - -

參考連結:http://www.cnblogs.com/xrq730/p/4865416.html


程式設計是一門藝術,程式設計師是藝術家,其他人是碼農!!

相關文章