阿里JAVA 开发手册----整理
1、命名嚴禁使用拼音與英文混合的方式。
2、領域模型命名規(guī)約
1) 數(shù)據(jù)對象: xxxDO, xxx 即為數(shù)據(jù)表名。
2) 數(shù)據(jù)傳輸對象: xxxDTO, xxx 為業(yè)務領域相關的名稱。
3) 展示對象: xxxVO, xxx 一般為網(wǎng)頁名稱。
4) POJO 是 DO/DTO/BO/VO 的統(tǒng)稱,禁止命名成 xxxPOJO。
3、long 或者 Long 初始賦值時,必須使用大寫的 L,小寫容易跟數(shù)字 1
混淆,造成誤解。
4、避免通過一個類的對象引用訪問此類的靜態(tài)變量或靜態(tài)方法,無謂增加編譯器解析成
本,直接用類名來訪問即可。
5、說明: 可變參數(shù)必須放置在參數(shù)列表的最后。(提倡同學們盡量不用可變參數(shù)編程)
正例: public User getUsers(String type, Integer... ids);(可為null的參數(shù)放最后)
6、Object 的 equals 方法容易拋空指針異常,應使用常量或確定有值的對象來調(diào)用 equals。
正例: "test".equals(object);
7、所有的相同類型的包裝類對象之間值的比較,全部使用 equals 方法比較。
說明: 對于 Integer var=?在-128 至 127 之間的賦值, Integer 對象是在 IntegerCache.cache
產(chǎn)生,會復用已有對象,這個區(qū)間內(nèi)的 Integer 值可以直接使用==進行判斷,但是這個區(qū)間之
外的所有數(shù)據(jù),都會在堆上產(chǎn)生,并不會復用已有對象,這是一個大坑,推薦使用 equals 方
法進行判斷。
8、注意 serialVersionUID 不一致會拋出序列化運行時異常。
9、關于基本數(shù)據(jù)類型與包裝數(shù)據(jù)類型的使用標準如下:
1) 所有的 POJO 類屬性必須使用包裝數(shù)據(jù)類型。
2) RPC 方法的返回值和參數(shù)必須使用包裝數(shù)據(jù)類型。
3) 所有的局部變量推薦使用基本數(shù)據(jù)類型。
10、final 可提高程序響應效率,聲明成 final 的情況:
1) 不需要重新賦值的變量,包括類屬性、局部變量。
2) 對象參數(shù)前加 final,表示不允許修改引用的指向。
3) 類方法確定不允許被重寫。
11、對象的 clone 方法默認是淺拷貝,若想實現(xiàn)深拷貝需要重寫 clone 方法實現(xiàn)屬性對象的
拷貝。
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 的內(nèi)部類 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 帶參方法,入?yún)⒎峙涞臄?shù)組空間不夠大時, toArray 方法內(nèi)部將重新分配
內(nèi)存空間,并返回新數(shù)組地址;如果數(shù)組元素大于實際所需,下標為[ list.size() ]的數(shù)組
元素將被置為 null,其它數(shù)組元素保持原值。
15、使用工具類 Arrays.asList()把數(shù)組轉換成集合時,不能使用其修改集合相關的方法,
它的 add/remove/clear 方法會拋出 UnsupportedOperationException 異常。
說明: asList 的返回對象是一個 Arrays 內(nèi)部類,并沒有實現(xiàn)集合的修改方法。 Arrays.asList
體現(xiàn)的是適配器模式,只是轉換接口,后臺的數(shù)據(jù)仍是數(shù)組。
String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);
第一種情況: list.add("c"); 運行時異常。
第二種情況: str[0]= "gujin"; 那么 list.get(0)也會隨之修改。
16、不要在 foreach 循環(huán)里進行元素的 remove/add 操作(會拋出ConcurrentModificationException)。 remove 元素請使用 Iterator
方式,如果并發(fā)操作,需要對 Iterator 對象加鎖。
17、Map集合:values()返回的是 V 值集合,是一個 list 集合對象; keySet()返回的是 K 值集合,是
一個 Set 集合對象; entrySet()返回的是 K-V 值組合集合。
18、高并發(fā)時,同步調(diào)用應該去考量鎖的性能損耗。能用無鎖數(shù)據(jù)結構,就不要用鎖;能
鎖區(qū)塊,就不要鎖整個方法體;能用對象鎖,就不要用類鎖。
19、線程池不允許使用 Executors 去創(chuàng)建,而是通過 ThreadPoolExecutor 的方式,這樣
的處理方式讓寫的同學更加明確線程池的運行規(guī)則,規(guī)避資源耗盡的風險。
說明: Executors 各個方法的弊端:
1) newFixedThreadPool 和 newSingleThreadExecutor:
主要問題是堆積的請求處理隊列可能會耗費非常大的內(nèi)存,甚至 OOM。
2) newCachedThreadPool 和 newScheduledThreadPool:
主要問題是線程數(shù)最大數(shù)是 Integer.MAX_VALUE,可能會創(chuàng)建數(shù)量非常多的線程,甚至 OOM。
20、注意,子線程拋出異常堆棧,不能在主線程 try-catch 到。
21、注意 Math.random() 這個方法返回是 double 類型,注意取值范圍 0≤x<1(能夠取
到零值,注意除零異常)。
22、單表行數(shù)超過 500 萬行或者單表容量超過 2GB,才推薦進行分庫分表。
23、where a=? and b>? 多個查詢條件,區(qū)分度高的在前,有=的在前。
24、禁止使用存儲過程,存儲過程難以調(diào)試和擴展,更沒有移植性(隱藏在DB中,不直觀難維護)。
25、刪除和修改記錄時,要先 select,避免出現(xiàn)誤刪除,確認無誤才能
提交執(zhí)行。
26、in 操作能避免則避免,若實在避免不了,需要仔細評估 in 后邊的集合元素數(shù)量,控
制在 1000 個之內(nèi)。
27、<isNotEmpty>表示不為空且不為 null 時執(zhí)行; <isNotNull>表示不為 null 值時執(zhí)行。
28、mysql類型DECIMAL 實際是以串存放的。盡量用DECIMAL取代float和double。
--分為Java語言部分、集合框架、Java線程與并發(fā)、數(shù)據(jù)庫。
https://yq.aliyun.com/articles/240163?spm=5176.10695662.1996646101.searchclickresult.7b4515c54fNXir
總結
以上是生活随笔為你收集整理的阿里JAVA 开发手册----整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jasperreports_Jasper
- 下一篇: 金蝶容器运维指南