阿里 JAVA 開發手冊__JAVA

來源:互聯網
上載者:User

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 方法容易拋null 指標異常,應使用常量或確定有值的對象來調用 equals。
正例: "test".equals(object);

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

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

9、關於基礎資料型別 (Elementary Data Type)與封裝資料類型的使用標準如下:
1) 所有的 POJO 類屬性必須使用封裝資料類型。
2) RPC 方法的傳回值和參數必須使用封裝資料類型。
3) 所有的局部變數推薦使用基礎資料型別 (Elementary Data Type)。

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


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.