阿里巴巴開發手冊-閱讀總結

以下是對阿里巴巴java開發手冊看了後的一些總結,便於自己以後複習。

功能類命名AbstractXXXXX,XXXXXExceptionXXXXXTest
boolean變量 不要用is前綴 序列化會出問題
將設計模式體現在名稱中 便於閱讀者快速理解

接口類中的方法和屬性不要加任何修飾符號(public 也不要加)

暴露出去的服務一定是接口 實現類以Impl爲後綴來區分

枚舉類帶上 Enum後綴

service/Dao層的命名規範:
獲取單個對象 用get做前綴
獲取多個對象 用list做前綴,負數結果,如:listUsers
獲取統計值的方法用count做前綴。
插入的方法用save/insert做前綴。
刪除的方法用remove/delete做前綴。
修改的方法用update做前綴。

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

不允許任何魔法值(即未經預先定義的常量)直接出現在代碼中。

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

常量類按類型分別創建 同時注意常量類的應用範圍,將類放到合適位置

如果變量值僅在一個固定範圍內變化用enum類型來定義。
if/for/while/switch/do等保留字與括號之間都必須加空格。

方法參數在定義和傳入時,多個參數逗號後邊必須加空格。

代碼邏輯分清紅花和綠葉,個性和共性,綠葉邏輯單獨出來成爲額外方法,使主幹代碼更加清晰;共性邏輯抽取成爲共性方法,便於複用和維護。

不同邏輯、不同語義、不同業務的代碼之間插入一個空行分隔開來以提升可讀性。

所有的覆寫方法,必須加@Override註解。
接口過時必須加@Deprecated註解,並清晰地說明採用的新接口或者新服務是什麼。
推薦使用java.util.Objects#equals

基本類型的包裝類型使用equals,比如Integer
任何貨幣金額,均以最小貨幣單位且整型類型來進行存儲。

所有的POJO類屬性必須使用包裝數據類型。
RPC方法的返回值和參數必須使用包裝數據類型。
所有的局部變量使用基本數據類型

定義DO/DTO/VO等POJO類時,不要設定任何屬性默認值。

構造方法裏面禁止加入任何業務邏輯,如果有初始化邏輯,請放在init方法中。

POJO類必須寫toString方法,有父類時加上super.toString

所有Service和DAO的getter/setter方法放在類體最後。
getter/setter方法中,不要增加業務邏輯,增加排查問題的難度。

不允許運行過程中重新賦值的局部變量應該聲明爲final。

工具類不允許有public或default構造方法。
類static成員變量如果僅在本類使用,必須是private。
若是static成員變量,考慮是否爲final。

日期格式化時,傳入pattern中表示年份統一使用小寫的y。正例:yyyy-MM-dd HH:mm:ss
表示月份是大寫的M;
表示分鐘則是小寫的m;
24小時制的是大寫的H;
12小時制的則是小寫的h。

使用枚舉值來指代月份。如果使用數字,注意Date,Calendar等日期相關類的月份month取值在0-11之間。

如果自定義對象作爲Map的鍵,那麼必須覆寫hashCode和equals。
判斷所有集合內部的元素是否爲空,使用isEmpty()方法

ArrayList的subList結果不可強轉成ArrayList,subList 返回的是ArrayList的內部類SubList,對於SubList子列表的所有操作最終會反映到原列表上。
在subList場景中,高度注意對父集合元素的增加或刪除,
均會導致子列表的遍歷、增加、刪除產生ConcurrentModificationException 異常。

使用集合轉數組的方法,必須使用集合的toArray(T[] array),傳入的是類型完全一致、長度爲0的空數組。
String[] array = new String[0];
String[] array2 = list.toArray(array);

使用工具類Arrays.asList()把數組轉換成集合時,不能使用其修改集合相關的方法,會拋出UnsupportedOperationException異常
第一種情況:list.add(“yangguanbao”); 運行時異常。
第二種情況:str[0] = “changed”; 轉換後的list值也會跟着變

原則:第一、頻繁往外讀取內容的,適合用<? extends T>。第二、經常往裏插入的,適合用<? super T>

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

map遍歷用entrySet **jdk1.8用Map.forEach()**方法
ConcurrentHashMap的 KV都不能爲null

創建線程或線程池時請指定有意義的線程名稱,方便出錯時回溯。自定義線程池,線程分組
線程資源必須通過線程池提供,不允許在應用中自行顯式創建線程。

線程池不允許使用Executors去創建,而是通過ThreadPoolExecutor的方式,
這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。

必須回收自定義的ThreadLocal變量,在try-finally中回收

對多個資源、數據庫表、對象同時加鎖時,**需要保持一致的加鎖順序,**否則可能會造成死鎖。

lock.lock()要在try外面調用,避免沒加鎖成功還進finally去解鎖

使用Timer必須捕獲異常,不然定時任務會終止

所有的類註釋都必須添加創建者和創建日期。

謹慎註釋掉代碼。在上方詳細說明,而不是簡單地註釋掉。如果無用,則刪除。

悲觀鎖遵循一鎖二判三更新四釋放的原則
子線程拋出異常堆棧,不能在主線程try-catch到。

需要注意自動拆箱導致的NPE異常。

在高併發場景中,避免使用”等於”判斷作爲中斷或退出的條件。可能存在併發問題導致小於數量而無法停止。

表達異常分支時,多用 if{ return}

避免採用取反邏輯運算符。

寫接口時,注意入參保護

被聲明爲private的方法,根據需要可不做校驗

註釋的要求:
1.能夠準確反映設計思想和代碼邏輯
2.能夠描述業務含義,使別的程序員能夠迅速瞭解到代碼背後的信息

生產環境禁止直接使用System.out 或System.err 輸出日誌

表名、字段名必須使用小寫字母或數字
表名不使用複數名詞。

索引名:pk uk idx_字段名
小數類型爲decimal,禁止使用float和double。
如果存儲的字符串長度幾乎相等,使用char定長字符串類型。

id create modified 必備這三個字段 時間類型爲datetime
表的命名最好是遵循“業務名稱_表的作用”

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

業務上具有唯一特性的字段,即使是組合字段,也必須建成唯一索引。
超過三個表禁止join。需要join的字段,數據類型保持絕對一致;多表關聯查詢時,保證被關聯的字段需要有索引。
在varchar字段上建立索引時,必須指定索引長度,沒必要對全字段建立索引,根據實際文本區分度決定索引長度。

深度分頁(先獲取id再關聯)
SELECT a.
FROM 表1 a, (select id from 表1 where 條件 LIMIT 100000,20 ) b where a.id=b.id
*

不要使用count(列名)或count(常量)來替代count();count()會統計值爲NULL的行
使用ISNULL()來判斷是否爲NULL值。

表的別名加as

在表查詢中,一律不要使用 * 作爲查詢的字段列表,需要哪些字段必須明確寫明。

即使所有類屬性名與數據庫字段一一對應,也需要定義;反過來,每一個表也必然有一個與之對應。

高併發服務器調小tcp協議的time_wait超時時間,調大文件句柄

給jvm設置參數**-XX:+HeapDumpOnOutOfMemoryError**參數,讓JVM碰到OOM場景時輸出dump信息。
在線上生產環境,JVM的Xms和Xmx設置一樣大小的內存容量,避免在GC 後調整堆大小帶來的壓力。
類在設計與實現時要符合單一原則。

謹慎使用繼承的方式來進行擴展,優先使用聚合/組合的方式來實現。 說明:不得已使用繼承的話,必須符合里氏代換原則,此原則說父類能夠出現的地方子類一定能夠出現

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