阿里 JAVA 開發手冊


1、命名嚴禁使用拼音與英文混合的方式。

2、領域模型命名規約
1) 數據對象: xxxDO, xxx 即爲數據表名。
2) 數據傳輸對象: xxxDTO, xxx 爲業務領域相關的名稱。
3) 展示對象: xxxVO, xxx 一般爲網頁名稱。
4) POJO 是 DO/DTO/BO/VO 的統稱,禁止命名成 xxxPOJO。

3、long 或者 Long 初始賦值時,必須使用大寫的 L,小寫容易跟數字 1
混淆,造成誤解。

4、避免通過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增加編譯器解析成
本,直接用類名來訪問即可。

5、說明: 可變參數必須放置在參數列表的最後。(提倡同學們儘量不用可變參數編程)
正例: public User getUsers(String type, Integer... ids);(可爲null的參數放最後)

6、Object 的 equals 方法容易拋空指針異常,應使用常量或確定有值的對象來調用 equals。
正例: "test".equals(object);

7、所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較。
說明: 對於 Integer var=?在-128 至 127 之間的賦值, Integer 對象是在 IntegerCache.cache
產生,會複用已有對象,這個區間內的 Integer 值可以直接使用==進行判斷,但是這個區間之
外的所有數據,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦使用 equals 方
法進行判斷。

8、注意 serialVersionUID 不一致會拋出序列化運行時異常。

9、關於基本數據類型與包裝數據類型的使用標準如下:
1) 所有的 POJO 類屬性必須使用包裝數據類型。
2) RPC 方法的返回值和參數必須使用包裝數據類型。
3) 所有的局部變量推薦使用基本數據類型。

10、final 可提高程序響應效率,聲明成 final 的情況:
1) 不需要重新賦值的變量,包括類屬性、局部變量。
2) 對象參數前加 final,表示不允許修改引用的指向。
3) 類方法確定不允許被重寫。

11、對象的 clone 方法默認是淺拷貝,若想實現深拷貝需要重寫 clone 方法實現屬性對象的
拷貝。

12、Map/Set 的 key 爲自定義對象時,必須重寫 hashCode 和 equals。
正例: String 重寫了 hashCode 和 equals 方法,所以我們可以非常愉快地使用 String 對象作
爲 key 來使用。

13、ArrayList 的 subList 結果不可強轉成 ArrayList,否則會拋出 ClassCastException
異常: java.util.RandomAccessSubList cannot be cast to java.util.ArrayList ;
說明: subList 返回的是 ArrayList 的內部類 SubList,並不是 ArrayList ,而是 ArrayList
的一個視圖,對於 SubList 子列表的所有操作最終會反映到原列表上。

14、List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
說明: 使用 toArray 帶參方法,入參分配的數組空間不夠大時, toArray 方法內部將重新分配
內存空間,並返回新數組地址;如果數組元素大於實際所需,下標爲[ list.size() ]的數組
元素將被置爲 null,其它數組元素保持原值。

15、使用工具類 Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方法,
它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。
說明: asList 的返回對象是一個 Arrays 內部類,並沒有實現集合的修改方法。 Arrays.asList
體現的是適配器模式,只是轉換接口,後臺的數據仍是數組。
String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);
第一種情況: list.add("c"); 運行時異常。
第二種情況: str[0]= "gujin"; 那麼 list.get(0)也會隨之修改。

16、不要在 foreach 循環裏進行元素的 remove/add 操作(會拋出ConcurrentModificationException)。 remove 元素請使用 Iterator
方式,如果併發操作,需要對 Iterator 對象加鎖。

17、Map集合:values()返回的是 V 值集合,是一個 list 集合對象; keySet()返回的是 K 值集合,是
一個 Set 集合對象; entrySet()返回的是 K-V 值組合集合。

18、高併發時,同步調用應該去考量鎖的性能損耗。能用無鎖數據結構,就不要用鎖;能
鎖區塊,就不要鎖整個方法體;能用對象鎖,就不要用類鎖。

19、線程池不允許使用 Executors 去創建,而是通過 ThreadPoolExecutor 的方式,這樣
的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。
說明: Executors 各個方法的弊端:
1) newFixedThreadPool 和 newSingleThreadExecutor:
主要問題是堆積的請求處理隊列可能會耗費非常大的內存,甚至 OOM。
2) newCachedThreadPool 和 newScheduledThreadPool:
主要問題是線程數最大數是 Integer.MAX_VALUE,可能會創建數量非常多的線程,甚至 OOM。

20、注意,子線程拋出異常堆棧,不能在主線程 try-catch 到。

21、注意 Math.random() 這個方法返回是 double 類型,注意取值範圍 0≤x<1(能夠取
到零值,注意除零異常)。

22、單錶行數超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。

23、where a=? and b>?  多個查詢條件,區分度高的在前,有=的在前。

24、禁止使用存儲過程,存儲過程難以調試和擴展,更沒有移植性(隱藏在DB中,不直觀難維護)。

25、刪除和修改記錄時,要先 select,避免出現誤刪除,確認無誤才能
提交執行。

26、in 操作能避免則避免,若實在避免不了,需要仔細評估 in 後邊的集合元素數量,控
制在 1000 個之內。

27、<isNotEmpty>表示不爲空且不爲 null 時執行; <isNotNull>表示不爲 null 值時執行。

28、mysql類型DECIMAL 實際是以串存放的。儘量用DECIMAL取代float和double。




https://yq.aliyun.com/articles/240163?spm=5176.10695662.1996646101.searchclickresult.7b4515c54fNXir


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章