編程規(guī)范


PO:(Persistent Object)持久層對象,它是由一組屬性和屬性的get和set方法組成的,最簡單的 PO 就是對應(yīng)數(shù)據(jù)庫中某個表中的一條記錄

DO:與數(shù)據(jù)庫表結(jié)構(gòu)一一對應(yīng),通過DAO層向上傳輸數(shù)據(jù)源對象。

VO:展示對象,通常用于業(yè)務(wù)層之間的數(shù)據(jù)傳遞。
BO:業(yè)務(wù)對象。 由Service層輸出的封裝業(yè)務(wù)邏輯的對象。

POJO:POJO專指只有setter/getter/toString的簡單類,包括DO/DTO/BO/VO等。

命名風(fēng)格

Service/DAO 層方法命名規(guī)約:
1) 獲取單個對象的方法用 get 做前綴。
2) 獲取多個對象的方法用 list 做前綴。
3) 獲取統(tǒng)計(jì)值的方法用 count 做前綴。
4) 插入的方法用 save(推薦)或 insert 做前綴。
5) 刪除的方法用 remove(推薦)或 delete 做前綴。
6) 修改的方法用 update 做前綴。

常量定義

枚舉成員名稱需要全大寫,單詞間用下劃線隔開。
DealStatusEnum : UNKOWN_REASON

接口類中的方法和屬性不要加任何修飾符號(public 也不要加),保持代碼的簡潔性,并加上有效的 Javadoc 注釋。

數(shù)組定義如下:String[] args;

常量命名全部大寫,單詞間用下劃線隔開:MAX_STOCK_COUNT

抽象類命名使用 Abstract 或 Base 開頭;異常類命名使用 Exception 結(jié)尾;測試類命名以它要測試的類的名稱開始,以 Test 結(jié)尾。

常量的復(fù)用層次:
1)子工程內(nèi)部共享常量:即在當(dāng)前子工程的 constant 目錄下。
2) 包內(nèi)共享常量:即在當(dāng)前包下單獨(dú)的 constant 目錄下。
3) 類內(nèi)共享常量:直接在類內(nèi)部 private static final 定義。

代碼格式

右大括號后還有 else 等代碼則不換行;表示終止的右大括號后必須換行。

方法參數(shù)在定義和傳入時,多個參數(shù)逗號后邊必須加空格

集合處理

只要重寫 equals,就必須重寫 hashCode
因?yàn)?Set 存儲的是不重復(fù)的對象,依據(jù) hashCode 和 equals 進(jìn)行判斷,所以 Set 存儲的對象必須重寫這兩個方法。

使用集合轉(zhuǎn)數(shù)組的方法,必須使用集合的 toArray

不要在 foreach 循環(huán)里進(jìn)行元素的 remove/add 操作。remove 元素使用 Iterator方式,如果并發(fā)操作,需要對 Iterator 對象加鎖。

使用 entrySet 遍歷 Map 類集合 KV,效率更高,只遍歷一次
如果是 JDK8,使用 Map.foreach 方法

利用 Set 元素唯一的特性,可以快速對一個集合進(jìn)行去重操作,避免使用 List 的contains 方法進(jìn)行遍歷、對比、去重操作。

線程安全

線程池不允許使用 Executors 去創(chuàng)建,而是通過 ThreadPoolExecutor 的方式
線程資源必須通過線程池提供,不允許在應(yīng)用中自行顯式創(chuàng)建線程。

多線程并行處理定時任務(wù)時,Timer 運(yùn)行多個 TimeTask 時,只要其中之一沒有捕獲
拋出的異常,其它任務(wù)便會自動終止運(yùn)行,使用 ScheduledExecutorService 則沒有這個問題。

子線程拋出異常堆棧,不能在主線程 try-catch 到

控制語句

在一個 switch 塊內(nèi),都必須包含一個 default 語句并且放在最后,即使它什么代碼也沒有。

在 if/else/for/while/do 語句中必須使用大括號。即使只有一行代碼,避免使用單行的形式

不要在條件判斷中執(zhí)行其它復(fù)雜的語句

注釋規(guī)范

使用 /** **/ 格式來注釋

其它

多用正則表達(dá)式

異常

Java 類庫中定義的一類 RuntimeException 可以通過預(yù)先檢查進(jìn)行規(guī)避,而不應(yīng)該
通過 catch 來處理,如:IndexOutOfBoundsException,NullPointerException等
示例:if (obj != null) {...}

對大段代碼進(jìn)行 try-catch,這是不負(fù)責(zé)任的表現(xiàn)。最外層的業(yè)務(wù)使用者,必須處理異常,將其轉(zhuǎn)化為用戶可以理解的內(nèi)容。

定義時區(qū)分 unchecked / checked 異常,避免直接拋出 new RuntimeException(),更不允許拋出 Exception 或者 Throwable,應(yīng)使用有業(yè)務(wù)含義的自定義異常。推薦業(yè)界已定義過的自定義異常,如:DAOException / ServiceException 等

在代碼中使用“拋異常”還是“返回錯誤碼”,對于公司外的 http/api 開放接口必須
使用“錯誤碼”

SQL語句

不要使用 count(列名)來替代 count(),count()跟數(shù)據(jù)庫無關(guān),跟 NULL 和非 NULL 無關(guān)。count()會統(tǒng)計(jì)值為 NULL 的行,而 count(列名)不會統(tǒng)計(jì)此列為 NULL 值的行。*

當(dāng)某一列的值全是 NULL 時,count(col)的返回結(jié)果為 0,但 sum(col)的返回結(jié)果為NULL,因此使用 sum()時需注意 NPE 問題

不得使用外鍵與級聯(lián),一切外鍵概念必須在應(yīng)用層解決。
學(xué)生表中的 student_id 是主鍵,那么成績表中的 student_id 則為外鍵。
如果更新學(xué)生表中的 student_id,同時觸發(fā)成績表中的 student_id 更新,則為級聯(lián)更新。
外鍵與級聯(lián)更新適用于單機(jī)低并發(fā),不適合分布式、高并發(fā)集群;級聯(lián)更新是強(qiáng)阻塞,存在數(shù)據(jù)庫更新風(fēng)暴的風(fēng)險;外鍵影響數(shù)據(jù)庫的插入速度

in 操作能避免則避免,若實(shí)在避免不了,需要仔細(xì)評估 in 后邊的集合元素?cái)?shù)量,控制在 1000 個之內(nèi)。

不允許直接拿 HashMap 與 Hashtable 作為查詢結(jié)果集的輸出。

@Transactional 事務(wù)不要濫用。事務(wù)會影響數(shù)據(jù)庫的 QPS(每秒鐘處理請求的次數(shù))

IDEA 快捷鍵:

?? 刪除到單詞的開頭 option+delete
??L 格式化代碼 command+option+L
command + shift + 上下箭頭
shift + Tab鍵 縮進(jìn)代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容