天天看點

JAVA | 代碼風格及規範

前言

最近在看阿裡的《碼出高效 Java開發手冊》一書,讀到代碼風格這一章節。工作了幾年,再看這一章節發現有些代碼規範也沒有做到。大公司對于代碼開發規範比較重視,對大部分的小公司而言就沒有那麼關注了。而這些編碼習慣會跟随你一輩子,在我看來,好的編碼習慣會有助提升你代碼的可讀性,維護性,更是一個優秀的程式員必備的素質。

命名規範

  • 包名同一使用小寫,點分隔符之間有且僅有一個自然語義的英文單詞。包名統一使用單數形式

    ,但是類名如果有複數含義,則可以使用複數形式。
  • 抽象類命名使用Abstract或Base開頭

    ;異常類命名使用Exception結尾,測試類命名以它要測試的類名開始,以Test結尾。
  • 類型與中括号緊挨相連來定義數組。

  • 枚舉類名帶上Enum字尾,

    枚舉成員名稱需要全大寫,單詞間用下劃線隔開

命名需要做到望文知義,進而減少注釋的内容,達到自然解釋的作用。而不規範的縮寫會導緻代碼了解困難,更大的罪過會把其他人引導到一個錯誤的方向上。例如把condition縮寫成condi,類似的縮寫會降低代碼的可讀性。

一般的情況下,變量的命名需要滿足小駝峰格式。但存在一種特殊情況,

在定義類成員變量的時候,特别是在POJO類中,針對布爾類型的變量,命名不要加is字首,否則部門架構解析會引起序列化錯誤

。例如,定義辨別是否删除的時候,

成員變量為Boolean isDeleted,它的getter方法也是isDelete(),在架構反向解析的時候,“誤以為”對應的屬性名是delete,導緻擷取不到屬性,進而抛出異常

。但是

在資料庫建表中,推薦表達是與否的值采用is_xxx的命名方式

,針對此種情況,需要在中設定,将資料表中的is_xxx字段映射到POJO類中的屬性Xxx

代碼展示風格

縮進

書中

推薦使用4個空格縮進,禁止使用Tab鍵

。因為在不同編輯器對Tab的解析不一緻,是以視覺體驗會有差異,而空格在不同編輯器之間是相容的。

空格

空格的使用又有如下規定:

  1. 任何二目,三目運算符的左右兩邊都必須加一個空格
  2. 注釋的雙斜杠與注釋内容之間有且僅有一個空格

  3. 方法參數在定義和傳入時,多個參數逗号後面必須加空格

  4. 如果大括号中内容為空,則簡潔的攜程{}即可,大括号内無需換行和空格
  5. 左右小括号與括号内部的相鄰字元之間不要出現空格
  6. 左大括号前需要加空格

示例:

try{
    // 任何二目,三目運算符的左右兩邊都必須加一個空格
    boolean condition = (count == 0) ? true : false;

    // 關鍵詞if與左側小括号之間必須有一個空格
    // 左大括号前需要加空格,左大括号後必須換行
    if (condition) {
        System.out.println("hello");
        // else 的前後需要加空格
    } else {
        System.out.println("world");
    }
// 如果大括号中内容為空,則簡潔的攜程{}即可,大括号内無需換行和空格
} catch (Exception e) {}

// 方法參數在定義和傳入時,多個參數逗号後面必須加空格
String result = getString(one, two, three);
           

換行

規定單行字元數不超過120個,超出則要換行

,換行遵循如下的規定:

  1. 運算符與下文一起換行
  2. 方法調用的點符号與下文一起換行
  3. 方法調用中的多個參數需要換行時,在逗号後換行
  4. 在括号前面不要換行

方法行數

約定一個方法内一般不超過80行

,不包括注釋、換行、空行、左右大括号。隻有5%不到的方法才會超過80行,而這些方法通常都還有優化的空間。

控制語句

  1. 在if、else、while、do-while等語句中必須使用大括号。及時隻有一行代碼,不能省略大括号。
  2. 在條件表達式中不允許有複制操作,也不允許在判斷表達式中出現複雜的邏輯組合。

  3. 多層嵌套不超過三層,

    超過三層的if-else邏輯判斷代碼,推薦使用衛語句、政策模式、狀态模式等來實作

  4. 避免采用取反邏輯運算符。比如if(x<10)表達x小于10,而不能使用if(!(x>=10))。

衛語句示例:

衛語句就是把複雜的條件表達式拆分成多個條件表達式,比如一個很複雜的表達式,嵌套了好幾層的if - then-else語句,轉換為多個if語句,實作它的邏輯,這多條的if語句就是衛語句.

if (obj != null) {
  doSomething();
}
 
轉換成衛語句以後的代碼如下:
if (obj == null) {
   return;
}
doSomething();
           

代碼注釋

類、類屬性、和類方法的注釋必須遵循Javadoc規範,使用文檔注釋 的格式。
  1. 枚舉的注釋是必要的,它的代碼極其穩定。如果定義和使用出現錯誤,通常影響較大。
  2. 注釋的内容不僅限于解釋屬性值的含義,還可以包括注意事項、業務邏輯。
  3. 枚舉類的删除或者修改都存在很大的風險。不可直接删除過時屬性,需要标注為過時,同時注釋說明過時的邏輯考慮和業務背景

單行注釋和多行注釋,特别強調

此類注釋不允許寫在代碼後方

,必須寫在代碼上方,這是為了避免注釋的參差不齊,導緻代碼版式混亂。