天天看點

java開發規範(筆記)

摘抄自阿裡巴巴開發手冊,記錄了一些比較經典的點。

一、程式設計規約

(一)命名規約

1.【強制】 代碼中的命名均不能以下劃線或者美元符号開始,也不能以下劃線或美元符号結束

反例 : _name/__name/ Object/name/name O b j e c t / n a m e / n a m e

2.【強制】 代碼中的命名嚴禁拼音與英文混合的方式,更不允許直接使用中文的方式。

說明:正确的英文拼寫和文法可以讓閱讀者易于了解,避免歧義。注意,即時純拼音的命名方式也要避免采用。

反例:DaZhePromotion【打折】/getPingfenByName() 【評分】

3.【強制】 類名使用UpperCamelCase風格,必須遵從駝峰形式,但以下情形例外:DO/BO/DTO/VO(領域模型的相關命名)

正例:MacroPolo /UserDao /XmlService /TcpUdpDeal

反例:macroPolo /UserDao /XMLService/TCPUDPDeal/TAPromotion

4.【強制】 方法名。參數名、成員變量、局部變量統一使用lowerCamelCase風格,必須遵從駝峰形式

正例:localValue / getHttpMessage() / inputUserId

5.【強制】常量命名全部大寫,單詞間用下劃線隔開,力求語義表達完整清楚,不要嫌名字長

正例:MAX_STOCK_COUNT

反例:MAX_COUNT

6.【強制】抽象類名命名使用Abstract或Base開頭;異常類命名使用Exception結尾;測試類命名以它要測試的類的名稱開始,以Test結尾。

7.【強制】POJO類中布爾類型的變量,都不要加is,否則部分架構解析會引起序列化錯誤。

反例:定義為基本資料類型boolean isSuccess 的屬性,它的方法也是isSuccess(),RPC架構在方向解析的時候,以為對應的屬性名稱是success,導緻屬性擷取不到,進而抛出異常。

8.【強制】包名統一使用小寫,點分隔符之間有且僅有一個自然語義的英文單詞。包名統一使用單數形式,但是類名如果有複數含義,類名可以使用複數形式。

正例:應用工具類包名為 com.alibaba.open.util、類名為MessageUtils

9.【強制】杜絕完全不規範的縮寫,避免望文不知義。

反例:AbstracClass 縮寫命名成 AbsClass ; condition 縮寫命名成condi,此類随意縮寫嚴重降低了代碼的可閱讀性。

10.【推薦】如果使用到了設計模式,建議在類名中展現出具體模式

說明:将設計模式展現在名字中,有利于閱讀者快速了解架構設計思想。

正例:public class OrderFactory;

public class LoginProxy;

public class ResourceObserver;

(二)格式規約

1.【強制】任何運算符左右必須加一個空格

說明:運算符包括指派運算符=、邏輯運算符&&、加減乘除符号、三目運作符

2.【強制】縮進采用4個空格,禁止使用tab字元

說明:如果使用tab縮進,必須設定1個tab為4個空格。IDEA設定tab為4個空格時,請勿勾選Use tab character;而在eclipse中,必須勾選insert spaces for tabs。

(三)OOP規約

1.【強制】避免通過一個類的對象引用通路此類的靜态變量或靜态方法,無謂增加編譯器解析成本,直接用類名來通路即可。

2.【強制】相同參數類型,相同業務含義,才可以使用java的可變參數,避免使用Object。

說明:可變參數必須放置在參數清單的最後。(提倡同學們盡量不用可變參數程式設計)

3.【強制】Object的equals 方法容易抛空指針異常,應使用常量或确定有值的對象來調用equals。

正例:“test”.equals(Object);

4.【強制】所有相同類型的包裝對象之間值的比較,全部使用equals方法比較。

說明:對于Integer var =?在-128至127之間的指派,Integer對象在IntegerCache.cache産生,會服用已有對象,這個區間的Integer值可以直接使用==進行判斷,但在這個區間之外的所有資料,都會在堆産生,并不會複用已有對象。這是一個大坑,推薦使用equals方法判斷。

5. 【強制】構造方法裡面進制加入任何業務邏輯,如果有初始化邏輯,請放在init方法中。

(四)集合處理

1.【強制】關于hashcode和equals的處理,遵循如下規則:

1).隻要重寫equals,就必須重寫hashCode。

2).因為Set存儲的是不重複的對象,依據hashCode和equals進行判斷,是以Set存儲的對象必須重寫這個兩個方法

3)如果自定義對象作為Map的鍵,那麼必須重寫hashCode和equals。

正例:String重寫了hashCode和equals方法,是以我們可以非常愉快地使用String對象作為key來使用。

2、【推薦】集合初始化時,盡量指定集合初始化大小

(五)并發處理

1、【強制】線程資源必須通過線程池提供,不允許在應用中自行顯式建立線程。

2、【推薦】避免Random執行個體被多線程使用,雖然共享該執行個體是線程安全的,但會因為競争同一seed導緻性能下降。

(六)控制語句

1、【強制】推薦盡量少用else,if-else的方式可以改寫成:

if(condition){

return obj;

}

//接着寫else的業務邏輯

說明:如果非得使用if()…else if()…else…方式表達邏輯 ,【強制】請勿超過3層,超過請使用狀态設計模式。

正例:邏輯上超過3層的if-else代碼可以使用衛語句,或者狀态模式來實作

2、【推薦】循環體中的語句要考量性能,以下操作盡量移至循環體外處理,如定義對象、變量、擷取資料庫連接配接,進行不必要的try-catch操作。

(七)版本問題

1、【強制】二方版本庫命名方式:主版本号.次版本号.修訂号

1)主版本号:當做了不相容api修改,或者增加了能改變産品方向的新功能

2)次版本号:當做了向下相容的功能性新增(新增類、接口)

3)修訂号:修複bug,沒有修改方法簽名的功能加強,保持Api相容性