阿里巴巴Java開發手冊(2021泰山版整理)
(一)命名風格
-
【強制】代碼中的命名均不能以下划線或美元符號開始,也不能以下划線或美元符號結束。
-
【強制】常量命名全部大寫,單詞間用下划線隔開,力求語義表達完整清楚,不要嫌名字長。
正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME
反例:MAX_COUNT / EXPIRED_TIME
-
【強制】抽象類命名使用
Abstract
或Base
開頭; 異常類命名使用
Exception
結尾; 測試類命名以它要測試的類的名稱開始,以
Test
結尾 -
【強制】
POJO
類中的任何布爾類型的變量,都不要加is
前綴,否則部分框架解析會引起序列化錯誤。說明:在本文 MySQL 規約中的建表約定第一條,表達是與否的值采用 is_xxx 的命名方式,所以,需要在
設置從 is_xxx 到 xxx 的映射關系。 反例:定義為基本數據類型 Boolean isDeleted 的屬性,它的方法也是 isDeleted(),框架在反向解析的時
候,“誤以為”對應的屬性名稱是 deleted,導致屬性獲取不到,進而拋出異常。
-
【強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英語單詞。
包名統一使用單數形式,但是類名如果有復數含義,類名可以使用復數形式。
正例:應用工具類包名為 com.alibaba.ei.kunlun.aap.util、類名為 MessageUtils
(此規則參考 spring 的框架結構)
-
【強制】杜絕完全不規范的縮寫,避免望文不知義。
反例:AbstractClass“縮寫”命名成 AbsClass;condition“縮寫”命名成 condi,
此類隨意縮寫嚴重降低了代碼的可閱讀性。
-
【推薦】為了達到代碼自解釋的目標,任何自定義編程元素在命名時,使用盡量完整的單詞組合來表達。
正例:在 JDK 中,對某個對象引用的 volatile 字段進行原子更新的類名為:AtomicReferenceFieldUpdater。
反例:常見的方法內變量為 int a;的定義方式。
-
【推薦】在常量與變量的命名時,表示類型的名詞放在詞尾,以提升辨識度。
正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT
反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD
- 【推薦】如果模塊、接口、類、方法使用了設計模式,在命名時需體現出具體模式。
說明:將設計模式體現在名字中,有利於閱讀者快速理解架構設計理念。
正例: public class OrderFactory;
public class LoginProxy;
public class ResourceObserver;
-
【推薦】接口類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔性,並加上有效的 Javadoc 注釋。
盡量不要在接口里定義變量,如果一定要定義變量,確定與接口方法相關,並且是整個應用的基礎常量。
正例:接口方法簽名 void commit();
接口基礎常量 String COMPANY = "alibaba";
反例:接口方法定義 public abstract void f();
說明:JDK8 中接口允許有默認實現,那么這個 default 方法,是對所有實現類都有價值的默認實現。
-
接口和實現類的命名有兩套規則:
1)【強制】對於 Service 和 DAO 類,基於 SOA 的理念,暴露出來的服務一定是接口,內部的實現類用 Impl 的后綴與接口區別。
正例:CacheServiceImpl 實現 CacheService 接口。
2)【推薦】如果是形容能力的接口名稱,取對應的形容詞為接口名(通常是–able 的形容詞)。
正例:AbstractTranslator 實現 Translatable 接口。
-
【參考】枚舉類名帶上 Enum 后綴,枚舉成員名稱需要全大寫,單詞間用下划線隔開。
說明:枚舉其實就是特殊的常量類,且構造方法被默認強制是私有。
正例:枚舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKNOWN_REASON。
-
【參考】各層命名規約:
A) Service/DAO 層方法命名規約
1) 獲取單個對象的方法用 get 做前綴。
2) 獲取多個對象的方法用 list 做前綴,復數結尾,如:listObjects。
3) 獲取統計值的方法用 count 做前綴。
4) 插入的方法用 save/insert 做前綴。
5) 刪除的方法用 remove/delete 做前綴。
6) 修改的方法用 update 做前綴。
B) 領域模型命名規約
1) 數據對象:xxxDO,xxx 即為數據表名。
2) 數據傳輸對象:xxxDTO,xxx 為業務領域相關的名稱。
3) 展示對象:xxxVO,xxx 一般為網頁名稱。
4) POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。
(二)常量定義
-
【強制】不允許任何魔法值(即未經預先定義的常量)直接出現在代碼中
-
【強制】在 long 或者 Long 賦值時,數值后使用大寫的 L,不能是小寫的 l,小寫容易跟數字混淆,造成誤解。
-
【推薦】不要使用一個常量類維護所有常量,要按常量功能進行歸類,分開維護。
說明:大而全的常量類,雜亂無章,使用查找功能才能定位到修改的常量,不利於理解,也不利於維護。
正例:緩存相關常量放在類 CacheConsts 下;系統配置相關常量放在類 ConfigConsts 下。
-
【推薦】常量的復用層次有五層:跨應用共享常量、應用內共享常量、子工程內共享常量、包內共享常量、類內共享常量。
1)跨應用共享常量:放置在二方庫中,通常是 client.jar 中的 constant 目錄下。
2)應用內共享常量:放置在一方庫中,通常是子模塊中的 constant 目錄下。
反例:易懂變量也要統一定義成應用內共享常量,兩位工程師在兩個類中分別定義了“YES”的變量:
類 A 中:public static final String YES = "yes";
類 B 中:public static final String YES = "y";
A.YES.equals(B.YES),預期是 true,但實際返回為 false,導致線上問題。
3)子工程內部共享常量:即在當前子工程的 constant 目錄下。
4)包內共享常量:即在當前包下單獨的 constant 目錄下。
5)類內共享常量:直接在類內部 private static final 定義。
-
【推薦】如果變量值僅在一個固定范圍內變化用 enum 類型來定義。
說明:如果存在名稱之外的延伸屬性應使用 enum 類型,下面正例中的數字就是延伸信息,表示一年中的第幾個季節。
正例:
public enum SeasonEnum { SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4); private int seq; SeasonEnum(int seq) { this.seq = seq; } public int getSeq() { return seq; }
(三)代碼格式
-
【強制】如果是大括號內為空,則簡潔地寫成{}即可,大括號中間無需換行和空格;
-
【強制】左小括號和右邊相鄰字符之間不出現空格;右小括號和左邊相鄰字符之間也不出現空格;而左大括號前需要加空格。
-
【強制】任何二目、三目運算符的左右兩邊都需要加一個空格。
說明:包括賦值運算符=、邏輯運算符&&、加減乘除符號等。
-
【強制】if/for/while/switch/do 等保留字與括號之間都必須加空格。
-
【強制】采用 4 個空格縮進,禁止使用 tab 字符。
說明:如果使用 tab 縮進,必須設置 1 個 tab 為 4 個空格。 IDEA 設置 tab 為 4 個空格時,請勿勾選 Use tab
character;而在 eclipse 中,必須勾選 insert spaces for tabs。
-
【強制】注釋的雙斜線與注釋內容之間有且僅有一個空格。
-
【強制】在進行類型強制轉換時,右括號與強制轉換值之間不需要任何空格隔開。
-
【強制】單行字符數限制不超過 120 個,超出需要換行,換行時遵循如下原則:
1)第二行相對第一行縮進 4 個空格,從第三行開始,不再繼續縮進,參考示例。
2)運算符與下文一起換行。
3)方法調用的點符號與下文一起換行。
4)方法調用中的多個參數需要換行時,在逗號后進行。
5)在括號前不要換行,見反例。
正例:
StringBuilder sb = new StringBuilder(); // 超過 120 個字符的情況下,換行縮進 4 個空格,並且方法前的點號一起換行 sb.append("zi").append("xin")... .append("huang")... .append("huang")... .append("huang");
反例:
StringBuilder sb = new StringBuilder(); // 超過 120 個字符的情況下,不要在括號前換行 sb.append("you").append("are")...append ("lucky"); // 參數很多的方法調用可能超過 120 個字符,逗號后才是換行處 method(args1, args2, args3, ... , argsX);
-
【強制】方法參數在定義和傳入時,多個參數逗號后邊必須加空格。
-
【強制】IDE 的 text file encoding 設置為 UTF-8; IDE 中文件的換行符使用 Unix 格式,不要使用 Windows 格式。
-
【推薦】單個方法的總行數不超過 80 行。
說明:除注釋之外的方法簽名、左右大括號、方法內代碼、空行、回車及任何不可見字符的總行數不超過80 行。
正例:代碼邏輯分清紅花和綠葉,個性和共性,綠葉邏輯單獨出來成為額外方法,使主干代碼更加清晰;共
性邏輯抽取成為共性方法,便於復用和維護。
-
【推薦】沒有必要增加若干空格來使變量的賦值等號與上一行對應位置的等號對齊。
正例:
int one = 1; long two = 2L; float three = 3F; StringBuilder sb = new StringBuilder();
說明:增加 sb 這個變量,如果需要對齊,則給 one、two、three 都要增加幾個空格,在變量比較多的情
況下,是非常累贅的事情。
-
【推薦】不同邏輯、不同語義、不同業務的代碼之間插入一個空行分隔開來以提升可讀性。
說明:任何情形,沒有必要插入多個空行進行隔開。