《阿里Java開發手冊》 | 編程規約 - 常數定義
【強制】不允許任何魔法值(即未經預先定義的常數)直接出現在程式碼中。
反例:
1 | //本例中同學 A 定義了緩存的 key,然後緩存提取的同學 B 使用了 Id#taobao 來提取,少了底線,導致故障。 |
【強制】在long或者Long賦值時,數值後使用大寫的L,不能是小寫的l,小寫容易跟數字1混淆,造成誤解。
說明:Long a = 2l; 寫的是數字的 21,還是 Long 型的 2。
【推薦】不要使用一個常數類維護所有常數,要按常數功能進行歸類,分開維護。
說明:大而全的常數類,雜亂無章,使用查找功能才能定位到修改的常數,不利於理解和維護。
正例:緩存相關常數放在類 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,導致線上問題。
- 反例:易懂變數也要統一定義成應用內共享常數,兩位工程師在兩個類中分別定義了“YES”的變數:
- 3.子工程內部共享常數:即在當前子工程的 constant 目錄下。
- 4.包內共享常數:即在當前包下單獨的 constant 目錄下。
- 5.類內共享常數:直接在類內部 private static final 定義。
【推薦】如果變數值僅在一個固定範圍內變化用enum類型來定義。
說明:如果存在名稱之外的延伸屬性應使用 enum 類型,下面正例中的數字就是延伸訊息,表示一年中的
第幾個季節。
正例:
1 | public enum SeasonEnum { |
心得
看完這篇「常數定義」後,發現多數專案在整理常數的時候,並沒有考慮到是否為共用、分類和放在哪一層。造成在維護上的困難,或是之間的判斷造成錯誤。
所以常數的定義,需要宏觀的了解整個業務、架構後,並且針對其設計初期就要考慮進去。
結語
文章越看越多,技術越學越多,就會發現自己的不足;技術學到後面都會想要將基礎再重新在打得更加扎實。
以前在開發覺得理所當然的事情,例如:命名規則、命名規範,照著別人怎麼說就怎麼做的想法,並沒有好好去想為什麼要這樣設計和規範。
於是乎同事們推薦《阿里巴巴Java開發手冊》來做閱讀,書中提到種種規範《正確範例》、《錯誤範例》還有解釋定義說明;我相信在閱讀完這一系列後,一定會更加扎實且實在。
如對此書有興趣,建議去購買官方認證的書籍,給予官方支持。
註:如有侵權,通知即刪。
註:以上參考了
Alibaba-Java-Coding-Guidelines Github
Alibaba-Java-Coding-Guidelines English Version