1. 程式人生 > 實用技巧 >阿里巴巴Java開發手冊(泰山版)個人閱讀精簡

阿里巴巴Java開發手冊(泰山版)個人閱讀精簡

java開發規範個人精簡

來自:阿里巴巴Java開發手冊(泰山版).pdf

根據自己的經驗進行適當提煉重要的,需要的

閱讀中。。。。

程式設計規約

命名風格

  1. 類名首字母大駱駝拼寫法。方法、引數、變數名小駱駝拼寫法

    LeiMing bianLiang fangFa(),canShu

  2. 常量命名全大寫,單詞用下劃線隔開

    final satic int MAX_SIZE =100;

  3. 抽象類命名使用 Abstract 或 Base 開頭

  4. 命名時儘量完整且與父子類或者不同程式碼塊的區域性變數之間採用完全相同的命名

  5. 包名統一小寫,.之間有且僅有一個自然語義的單詞

  6. 介面類中的方法和屬性不要加任何修飾符號(public 也不要加)

  7. 對於 Service 和 DAO 類,基於 SOA 的理念,暴露出來的服務一定是介面,內部的實現類用Impl 的字尾與介面區別。

    CacheServiceImpl 實現 CacheService 介面

  8. 列舉類名帶上 Enum 字尾,列舉成員名稱需要全大寫,單詞間用下劃線隔開。

    列舉名字為 ProcessStatusEnum 的成員名稱:SUCCESS / UNKNOWN_REASON。

  9. Service/DAO層命名規約(參考mybatis-plus的文件)

    1. 獲取單個物件的方法用 get 做字首

    int getById(int uid)

    1. 獲取多個物件的方法用 list 做字首,複數結尾

      List list();

      Collection listByMap(Map<String, Object> columnMap);

    2. 獲取統計值的方法用 count 做字首

      int count();

    3. 插入的方法用 save/insert 做字首

      // 插入一條記錄(選擇欄位,策略插入)
      boolean save(T entity);
      // 插入(批量)
      boolean saveBatch(Collection entityList);

    4. 刪除的方法用 remove/delete 做字首

      // 根據 entity 條件,刪除記錄
      boolean remove(Wrapper<T> queryWrapper);
      // 根據 ID 刪除
      boolean removeById(Serializable id);
      // 根據 columnMap 條件,刪除記錄
      boolean removeByMap(Map<String, Object> columnMap);
      
    5. 修改的方法用 update 做字首。

  10. long 或者 Long 賦值時,數值後使用大寫的 L,不能是小寫的 l

程式碼格式

  1. 任何二目、三目運算子的左右兩邊都需要加一個空格

  2. 左小括號和右邊相鄰字元之間不出現空格

    反例 :if (空格 a == b 空格)

    正例 : if (flag == 0)

  3. 採用 4 個空格縮排,禁止使用 tab 字元

  4. 書中樣例

public static void main(String[] args) {
    // 縮排 4 個空格
    String say = "hello";
    // 運算子的左右必須有一個空格
    int flag = 0;
    // 關鍵詞 if 與括號之間必須有一個空格,括號內的 f 與左括號,0 與右括號不需要空格
    if (flag == 0) {
        System.out.println(say);
    }

    // 左大括號前加空格且不換行;左大括號後換行
    if (flag == 1) {
        System.out.println("world");
    // 右大括號前換行,右大括號後有 else,不用換行
    } else {
        System.out.println("ok");
    // 在右大括號後直接結束,則必須換行
    }
}
  1. 註釋的雙斜線註釋內容之間有且僅有一個空格

    // 註釋

  2. 單行字元不能太長,超出換行並相對首行縮排4個空格,.參與換行,方法的引數則是,後換行

sb.append("zi").append("xin" .append("huang")...         .append("huang1)
    .append("huang2)                                 
  1. IDE 的 text file encoding 設定為 UTF-8; IDE 中檔案的換行符使用 Unix 格式,不要使用 Windows 格式

OOP規約

  1. 避免通過一個類的物件引用訪問此類的靜態變數或靜態方法,無謂增加編譯器解析成本,直接用類名來訪問即可

  2. 所有的覆寫方法,必須加@Override 註解。

  3. 介面過時必須加@Deprecated 註解,並清晰地說明採用的新介面或者新服務是什麼

  4. 任何貨幣金額,均以最小貨幣單位且整型型別來進行

  5. 關於基本資料型別與包裝資料型別的使用標準如下

    1. 所有的 POJO 類屬性必須使用包裝資料型別。
    2. RPC 方法的返回值和引數必須使用包裝資料型別
    3. 【推薦】所有的區域性變數使用基本資料類
  6. 構造方法裡面禁止加入任何業務邏輯,如果有初始化邏輯,請放在 init 方法中。

  7. POJO 類必須寫 toString 方法

  8. 禁止在 POJO 類中,同時存在對應屬性 xxx 的 isXxx()和 getXxx()方

  9. 在getter/setter 方法中,不要增加業務邏輯,增加排查問題的難度。

  10. 類成員與方法訪問控制從嚴: 書中第25點 太長不弄上來

日期時間

  1. 不允許在程式任何地方中使用:1)java.sql.Date 2)java.sql.Time 3)ava.sql.Timestamp

    Date真的是就日期,不包括時分秒

    Time同理

    TimeStamp 在構造方法 super((time/1000)*1000),fastTime 和 nanos 分開儲存秒和納秒資訊。

  2. 獲取當前毫秒數:System.currentTimeMillis(); 而不是 new Date().getTime()。

  3. 別忘了閏月的存在

集合處理

  1. 只要重寫 equals,就必須重寫 hashCode

  2. 如果自定義物件作為 Map 的鍵,那麼必須覆寫 hashCodeequals

  3. Set 儲存的物件必須重寫 hashCodeequals

  4. 判斷所有集合內部的元素是否為空,使用 isEmpty()方法

  5. 不要在 foreach 迴圈裡進行元素的 remove/add 操作。remove 元素請使用 Iterator方式,如果併發操作,需要對 Iterator 物件加鎖

    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
    	 String item = iterator.next();
    	 if (刪除元素的條件) {
    		 iterator.remove();
    	 }
    }
    
  6. 集合初始化時,指定集合初始值大,不確定就用16

  7. 高度注意 Map 類集合 K/V 能不能儲存 null 值的情況

    集合類 Key Value Super 說明
    Hashtable 不允許為null Dictionary 執行緒安全
    ConcurrentHashMap AbstractMap 鎖分段技術
    TreeMap 允許 AbstractMap 執行緒不安全
    HashMap 允許 允許 AbstractMap 執行緒不安全
  8. 利用 Set 元素唯一的特性,可以快速對一個集合進行去重操作,避免使用 List 的contains()進行遍歷去重或者判斷包含操作

控制語句

p24

註釋規約

p27

併發處理

P20-P23

沒細學,先不看 2020年7月14日

異常日誌

p30

單元測試

p36

安全規約

p38