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