java程式碼參考規範
- 字首
字首名 | 描述 | 舉例 |
---|---|---|
Abstract | 抽象類 | AbstractBeanFactory |
Base | 基礎類(提供常用方法) | BaseDao |
Default | 預設類(對某介面的預設實現) | DefaultAopProxyFactory |
- 字尾
字尾名 | 描述 | 舉例 |
---|---|---|
Service | 表明這個類是個服務類,裡面包含了給其他類提同業務服務的方法 | PaymentOrderService |
Impl | 這個類是一個實現類,而不是介面 | PaymentOrderServiceImpl |
Dao | 這個類封裝了資料訪問方法 | PaymentOrderDao |
Listener | 響應某種事件的類 | PaymentSuccessListener |
Action | 直接處理頁面請求,管理頁面邏輯了類 | UpdateOrderListAction |
Filter | 這個類是過濾器 | EncodingFilter |
Event | 這個類代表了某種事件 | PaymentSuccessEvent |
Servlet | 一個Servlet | PaymentCallbackServlet |
Factory | 生成某種物件工廠的類 | PaymentOrderFactory |
Adapter | 用來連線某種以前不被支援的物件的類 | DatabaseLogAdapter |
Job | 某種按時間執行的任務 | PaymentOrderCancelJob |
Wrapper | 這是一個包裝類,為了給某個類提供沒有的能力 | SelectableOrderListWrapper |
Bean | 這是一個POJO | MenuStateBean |
Exception | 異常類 | ErrorParametersException |
7.常量命名要全部大寫,單詞間用下劃線分隔,要求語義表達完整,不要嫌名字長。
8.陣列定義一律採用String[] args這種方式,不可使用String args[]的定義方式。
9.POJO類中布林型別的變數不要加is,否則部分框架解析會引起序列化錯誤。
- 正例:boolean success
- 反例:boolean isSuccess
10.每一個POJO類要給出toString()方法,便於列印日誌或者查詢bug。
11.介面類中的方法不要加任何修飾符號,保持程式碼簡潔性。儘量不要在介面中定義變數。
-
正例:void sayHello()
-
反例:public void sayHello()
12.列舉類名建議帶上Enum字尾,列舉成員名稱要全部大寫,單詞間用下劃線隔開。
- 正例:列舉類名:DealStatusEnum,成員名稱:SUCCESS / UNKNOWN_REASON
13.Service/Dao層方法命名規約:
1) 獲取單個物件用get做字首;
2) 獲取多個物件用list做字首;
3) 獲取統計值的方法用count做字首;
4) 插入方法用save或insert做字首;
5) 刪除方法用remove或delete做字首;
6) 修改方法用update做字首。
14.long或者Long型別賦值時,必須使用大寫的L,不能使用小寫的l,避免和數字1造成混淆。
- 正例:Long a = 2L
- 反例:Long a = 2l
15.不要使用一個常量類來維護所有的常量,如果常量過多不利於維護。應該按照常量的功能進行分類,分開定義和維護。比如與快取相關的常量定義在CacheConsts下;系統配置相關的常量定義在ConfigConsts下。
16.杜絕不規範的縮寫,避免望文不知義。
- 反例:AbstractClass縮寫為AbsClass,此類隨意的縮寫會嚴重降低程式碼的可閱讀性
二、格式規約
1.大括號的使用約定:如果大括號內為空,則直接間接的寫成{},不需要換行;如果是為空程式碼塊,則:
1) 左大括號前不換行,左大括號後換行;
2) 右大括號前換行;
3) 右大括號後還有else等程式碼則不換行。
2.左括號與後一個字元之間不加空格,右括號與前一個字元之間不加空格。
3.if/for/while/switch/do等關鍵字與左右括號之間加空格。
4.任何一個運算子左右兩邊加空格。
說明:運算子包括賦值運算子=、邏輯運算子&&、加減乘除符號、三目運算子等。
5.單行字元數不宜超過120個,超出則需要換行,換行是遵循以下規則:
1) 第二行相對於第一行縮排4個空格,從第三行開始不在繼續縮排;
2) 運算子與下文一起換行;
3) 方法呼叫的點號與下文一起換行;
4) 多個引數超長,在逗號後進行換行;
5) 在括號前不要換行
-
正例:
StringBuffer sb = new StringBuffer();
sb.append(“a”).append(“b”)...
.append(“c”)...
.append(“d”);
-
反例:
StringBuffer sb = new StringBuffer();
sb.append(“a”).append(“b”)...append
(“c”);
6.IDE中的text file encoding 設定為UTF-8。
7.建議方法體內的執行語句組、變數的定義語句組、不同的業務邏輯之間或者不同的語義之間插入一個空行。相同的業務邏輯和語義之間不需要插入空行。
8.每個檔案不超過2000行,避免將所有方法放到一個類中,影響問題查詢和程式碼閱讀。
三、編碼規約
1.不要通過一個類的物件來訪問該類的靜態變數或靜態方法,直接通過類名訪問即可。
2.不要使用過時的類或者方法。
說明:java.net.URLDecoder 中的decode(String encodeStr)方法已經過時,應該使用decode(String source,String encode)方法。
3.Object的equals方法容易產生NPE問題,應該使用常量或者確定有值的物件來呼叫equals。
-
正例:”test”.equals(object)
-
反例:object.equals(“test”)
說明:推薦使用java.util.Objects#equals(JDK7引入的工具類)
4.所有包裝類物件之間值的比較全部使用equals方法。
5.基本資料型別與包裝型別的使用標準如下:
1) 所有的POJO類屬性必須使用包裝型別;
2) RPC介面的返回值和引數必須使用包裝型別;
3) 方法中所有的區域性變數使用基本資料型別。
6.構造方法裡面不要加入任何業務邏輯,如果有業務邏輯,放到init方法中。
7.當一個類中有多個構造方法或者同名方法時,按照順序放置在一起,便於閱讀。
8.類方法應最小化訪問許可權。
說明:能用protected的就不要用public。不要將所有的方法都設為public。
9.迴圈體內的字串連線使用StringBuilder的append方法。
10.對集合List迴圈遍歷之前,除非明確該集合肯定不為空,否則一定要做非空判斷。
11.不要在foreach迴圈裡進行元素的remove/add操作。remove元素請使用Iterator方式,如果併發操作,需要對Iterator物件加鎖。
12.使用entrySet遍歷Map類集合KV,而不是keySet方式進行遍歷。
13.利用Set元素唯一的特性,可以快速對一個集合進行去重操作,避免使用List的contains方法進行遍歷、對比、去重操作。
14.在switch塊內,每一個case要麼通過break/return等來終止,要麼註釋說明程式將執行到哪個case為止;每一個switch都必須包括default並且放在最後,即使什麼程式碼也沒有。
15.條件語句都必須使用大括號,即使只有一行程式碼,避免使用單行的形式。 \
- 反例:if ( condition ) statements
16.表達異常的分支時,少用if-else方式,這種方式可以改寫成:
If(condition) {
......
return obj;
}
//接著寫else的業務邏輯程式碼
說明:如果非要使用if()...else if()...else...方式表達邏輯,不要超過3層,避免程式碼維護困難。
17.條件判斷中不要執行過於複雜的語句,將複雜邏輯判斷賦值給一個有意義的布林變數名,以提高可讀性。
18.迴圈體內的語句要注意考量效能,比如定義物件、變數、獲取資料庫連線、進行不必要的try-catch操作等儘量移至迴圈體外處理。
19.在類、類屬性、類方法的註釋必須使用javadoc規範,即使用/*內容/格式,不得使用//XXX的方式。
20.所有的抽象方法(包括介面中的方法)都必須用javadoc註釋,並且說明該方法的功能。
21.方法內部單行註釋,在被註釋語句上方另起一行,用//註釋;多行註釋使用/* */註釋,與程式碼對齊。
22.程式碼修改的同時,也要修改相應的註釋,避免程式碼已經修改了多版,但註釋還是第一版,導致註釋與程式碼嚴重不符。
23.建議任何資料結構的構造或初始化,指定初始化大小。
24.不要嘗試通過異常來進行流程控制,條件控制,因為異常的處理效率比條件分支低。
25.不要對大段程式碼進行try-catch。要儘量分清穩定程式碼和非穩定程式碼。
26.捕獲到異常不要什麼都不做,如果不想處理它,請向上丟擲。
27.不能在finally塊中使用return,finally塊中的return返回後方法結束,不會再執行try塊中的return語句。
28.方法如果返回null時,要特別註釋說明什麼情況下會返回null,呼叫者需要進行非空判斷防止NPE問題。
29.避免出現大量重複性的程式碼。
30.在方法的有效輸入、輸出和關鍵位置要列印有意義的日誌,對於問題的排查有好處。列印日誌請使用log.info(),避免使用System.out.println()。
31.資料庫中小數型別為decimal,不要使用float和double。
說明:float和double在儲存的時候存在精度損失的問題,很可能在值的比較時得不到正確的結果。
32.程式碼中涉及到小數的運算時,尤其是跟錢有關時,一定要使用BigDecimal進行操作,否則會造成精度缺失,資料錯誤。
33.方法的引數不宜過多,當超過6個引數時,應將引數封裝成一個類來使用。
34.異常的捕獲或者丟擲不要都使用java.lang.Exception,要對具體的異常進行細分。
35.方法中的引數不要在方法體內對其進行重新賦值,要想使用方法中的變數值,要重新定義變數進行賦值。
36.同一行中不要宣告多個變數。
- 正例:int a=0;
Int b=1;
- 反例:int a=0;b=1;
37.複寫的方法一定要加@Override註解。
38.Pojo類中的成員變數不要定義預設值。
39.一個類中的各個元件定義順序如下:
靜態變數->私有變數->構造方法->公有方法->保護方法->私有方法->set/get方法
40.重寫equals方法的同時要重寫hashCode方法。