1. 程式人生 > >阿里Java開發手冊學習筆記(一)----程式設計規約

阿里Java開發手冊學習筆記(一)----程式設計規約

一、命名規範

  1. 不以下劃線(_)或美元符號($)開始/結尾。
  2. 不允許中英文混合使用,不允許直接使用中文。
  3. 類名使用UpperCamelCase風格;方法名、引數名、成員變數使用lowerCamelCase風格,都要遵從駝峰式命名。常量名全大寫,用下劃線(_)分隔。
  4. 抽象類以Abstract/Base開頭,異常類以Exception結尾,測試類以被測試類名字+Test方式命名。
  5. POJO類中布林型別變數不加is,避免部分框架解析時發生錯誤。
  6. 包名統一小寫,統一使用單數形式。
  7. 不要瞎jb縮寫。
  8. 將設計模式體現在命名中。
  9. 介面類方法、屬性不加任何修飾符號,包括public
  10. Service與DAO暴露出的一定是介面,對應實現加Impl字尾。 e.g. CacheService對應實現為CacheServiceImpl
    形容能力的介面,取對應形容詞作為介面的名稱。 e.g. AbstractTranslator實現Translatable
  11. Service、DAO方法命名規範:
  • 單個物件獲取用get,多個用list字首
  • 統計用count字首
  • 插入用save(推薦)、insert字首
  • 刪除用remove(推薦)、delete字首
  • 修改用update字首
  1. 領域模型命名
  • 資料物件 XXXDO
  • 資料傳輸物件 XXXDTO
  • 展示物件 XXXDVO

二、常量規範

  1. 不允許出現魔法值,比如 String str="id="+id;
  2. long/Long型變數用L(不使用l)標明。
  3. 按常量功能進行分類,分開維護。
  4. 常量複用的五個層次:
  • 跨應用的共享常量,放於第二方庫中
  • 應用內共享常量,放於第一方庫modules的const目錄下
  • 子工程內部共享變數,放於子工程const目錄下
  • 包內共享常量,在當前包內單獨const目錄下
  • 類內共享,直接在類內部定義。
  1. 變數在一個範圍內變化用Enum。

三、OOP規約

  1. 使用類名訪問此類的靜態變數或者靜態方法。
  2. 所有複寫方法必須加@Override註解。
  3. 對過時的介面方法加@Deprecated註解,並說明新介面新服務是什麼。
  4. 不能使用過時的方法或者類。
  5. 使用常量或確定有值的物件來呼叫equals方法。
  6. 所有相同型別的包裝類之間值的比較全使用equals方法。
  7. 所有POJO類屬性都使用包裝資料型別。RPC方法的返回值與引數也使用包裝資料型別。區域性變數使用基本資料型別。
  8. 定義DO/DTO/DVO等POJO類時,不要設定任何屬性的預設值。
  9. 序列化類新增屬性的時候不要修改serialVersionUID、避免反序列失敗。如果完全不相容升級,避免反序列化混亂,需要修改serialVersionUID。
  10. 構造方法裡禁止加入任何業務邏輯,如有初始化邏輯,放置在init方法中。
  11. POJO類必須重寫toString方法。如果繼承了另一個POJO類,在前面加super.toString()。
  12. 構造方法按順序放在一起。
  13. 類內方法順序:public->protect->private->setter/getter
  14. 迴圈體內,使用StringBulider的append方法對字串進行擴充套件。

四、集合處理

  1. Map/Set的key為自定義物件時,必須重寫hashCode和equals。
  2. ArrayList的subList結果可強轉為ArrayList。並且,對subList的操作都會反映到源列表上。對原集合的個數的修改會導致subList的操作產生異常。
  3. 使用集合轉陣列時使用集合類的toArray(T[]array),傳入型別大小一樣的陣列。
  4. 使用工具類Arrays.asList()把陣列轉換成集合時,不能使用其修改集合相關的方法。
  5. 泛型萬用字元<? extends T>來接受返回的資料,此寫法的泛型集合不能使用add方法。
  6. 不要在foreach迴圈裡進行元素的remove/add操作。
  7. 集合初始化時儘量指定集合初始值的大小。
  8. 使用entrySet遍歷Map類集合而不是keySet方式進行遍歷。
  9. 注意Map類集合K/V能否儲存null情況。
  10. 利用Set元素唯一的特性對另一集合去重,避免手動遍歷。

五、併發處理

  1. 獲取單例物件要執行緒安全。在單例物件中操作也要保證執行緒安全。
  2. 執行緒資源必須通過執行緒池提供,不允許在應用中自行顯示建立執行緒。
  3. 高併發時,同步呼叫應該儘量減小鎖的效能損耗.
  4. 對多個資源同時加鎖時,需要保證一致的加鎖順序,否則會造成死鎖。
  5. 併發修改同一記錄時,避免更新丟失,要麼在應用層加鎖要麼在快取加鎖,要麼在資料庫使用樂觀鎖,並使用version作為更新依據。
  6. 多執行緒並行處理定時任務時,Timer執行多個TimerTask時,只要其中之一沒有捕獲丟擲的異常,其它任務便會自動終止,使用ScheduledExecutorService來避免這個問題。
  7. 執行緒池不允許使用Executors建立,而是使用ThreadPoolExecutor。(瞭解使用Executors的諸多弊端)
  8. 建立執行緒or執行緒池時需指定有意義的執行緒名稱。
  9. 使用CountDownLatch進行非同步轉同步操作時,每個執行緒退出前必須呼叫countDown()方法,執行緒執行程式碼注意catch異常,以確保countDown方法可以執行,避免主執行緒無法執行countDown方法直到超時才返回結果。
  10. 避免Random例項被多執行緒使用,會因競爭同一seed導致效能下降。

六、控制語句

  1. switch塊中每個case要麼通過break/return終止,要麼註釋說明將要執行到哪一個case為止。必須新增default在結尾。
  2. if/else/for/while/do 必須使用大括號。
  3. 儘量少使用else if-else if-else表達邏輯不應超過3層,超過應使用狀態設計模式。
  4. 判斷語句儘量精簡。
  5. 定義物件、變數、獲取資料庫連線、try-catch操作,儘量移動到迴圈體外。

七、註釋規約

  1. 類、類屬性、類方法必須使用javadoc註釋。
  2. 所有抽象方法必須使用javadoc註釋。說明返回值、引數、異常、功能。
  3. 所有類需加建立者資訊。
  4. 所有列舉欄位必須註釋,說明用途。
  5. 程式碼修改時同步修改註釋。
  6. 註釋掉的程式碼配合說明,是以後恢復還是永久棄用。

八、其它

  1. 使用正則表示式時利用好預編譯功能,可加快正則匹配速度。
  2. 後臺輸送給頁面的變數需加! — $!{var}
  3. 獲取當前時間毫秒使用System.currentTimeMillis()