Like Share Discussion Bookmark Smile

J.J. Huang   2020-04-29   Java   瀏覽次數:

《阿里Java開發手冊》 | 編程規約 - 常數定義

【強制】不允許任何魔法值(即未經預先定義的常數)直接出現在程式碼中。
反例:

1
2
3
//本例中同學 A 定義了緩存的 key,然後緩存提取的同學 B 使用了 Id#taobao 來提取,少了底線,導致故障。
String key = "Id#taobao_" + tradeId;
cache.put(key, value);

【強制】在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,導致線上問題。
  • 3.子工程內部共享常數:即在當前子工程的 constant 目錄下。
  • 4.包內共享常數:即在當前包下單獨的 constant 目錄下。
  • 5.類內共享常數:直接在類內部 private static final 定義。

【推薦】如果變數值僅在一個固定範圍內變化用enum類型來定義。
說明:如果存在名稱之外的延伸屬性應使用 enum 類型,下面正例中的數字就是延伸訊息,表示一年中的
第幾個季節。
正例:

1
2
3
4
5
6
7
8
9
10
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;
 }
}

心得

看完這篇「常數定義」後,發現多數專案在整理常數的時候,並沒有考慮到是否為共用、分類和放在哪一層。造成在維護上的困難,或是之間的判斷造成錯誤。

所以常數的定義,需要宏觀的了解整個業務、架構後,並且針對其設計初期就要考慮進去。

結語

文章越看越多,技術越學越多,就會發現自己的不足;技術學到後面都會想要將基礎再重新在打得更加扎實。

以前在開發覺得理所當然的事情,例如:命名規則、命名規範,照著別人怎麼說就怎麼做的想法,並沒有好好去想為什麼要這樣設計和規範。
於是乎同事們推薦《阿里巴巴Java開發手冊》來做閱讀,書中提到種種規範《正確範例》、《錯誤範例》還有解釋定義說明;我相信在閱讀完這一系列後,一定會更加扎實且實在。

如對此書有興趣,建議去購買官方認證的書籍,給予官方支持。

註:如有侵權,通知即刪。


註:以上參考了
Alibaba-Java-Coding-Guidelines Github
Alibaba-Java-Coding-Guidelines English Version