阿里強制要求的21條Java開發規範,能夠避免不少坑

1. 【強制】避免經過一個類的對象引用訪問此類的靜態變量或靜態方法,無謂增長編譯器解析成本,直接用類名來訪問便可。java

2. 【強制】全部的覆寫方法,必須加@Override註解。 說明:getObject()與get0bject()的問題。一個是字母的O,一個是數字的0,加@Override能夠準確判斷是否覆蓋成功。另外,若是在抽象類中對方法簽名進行修改,其實現類會立刻編譯報錯。數據庫

3. 【強制】相同參數類型,相同業務含義,纔可使用Java的可變參數,避免使用Object。 說明:可變參數必須放置在參數列表的最後。(提倡同窗們儘可能不用可變參數編程) 正例:public List<User> listUsers(String type, Long... ids) {...}編程

4. 【強制】外部正在調用或者二方庫依賴的接口,不容許修改方法簽名,避免對接口調用方產生影響。接口過期必須加@Deprecated註解,並清晰地說明採用的新接口或者新服務是什麼。設計模式

5. 【強制】不能使用過期的類或方法。 說明:java.net.URLDecoder 中的方法decode(String encodeStr) 這個方法已通過時,應該使用雙參數decode(String source, String encode)。接口提供方既然明確是過期接口,那麼有義務同時提供新的接口;做爲調用方來講,有義務去考證過期方法的新實現是什麼。數組

6. 【強制】Object的equals方法容易拋空指針異常,應使用常量或肯定有值的對象來調用equals。 正例:"test".equals(object); 反例:object.equals("test"); 說明:推薦使用java.util.Objects#equals(JDK7引入的工具類)app

7. 【強制】全部的相同類型的包裝類對象之間值的比較,所有使用equals方法比較。 說明:對於Integer var = ? 在-128至127範圍內的賦值,Integer對象是在IntegerCache.cache產生,會複用已有對象,這個區間內的Integer值能夠直接使用==進行判斷,可是這個區間以外的全部數據,都會在堆上產生,並不會複用已有對象,這是一個大坑,推薦使用equals方法進行判斷。框架

8. 關於基本數據類型與包裝數據類型的使用標準以下: 1) 【強制】全部的POJO類屬性必須使用包裝數據類型。 2) 【強制】RPC方法的返回值和參數必須使用包裝數據類型。 3) 【推薦】全部的局部變量使用基本數據類型。 說明:POJO類屬性沒有初值是提醒使用者在須要使用時,必須本身顯式地進行賦值,任何NPE問題,或者入庫檢查,都由使用者來保證。 正例:數據庫的查詢結果多是null,由於自動拆箱,用基本數據類型接收有NPE風險。 反例:好比顯示成交總額漲跌狀況,即正負x%,x爲基本數據類型,調用的RPC服務,調用不成功時,返回的是默認值,頁面顯示爲0%,這是不合理的,應該顯示成中劃線。因此包裝數據類型的null值,可以表示額外的信息,如:遠程調用失敗,異常退出。ide

9. 【強制】定義DO/DTO/VO等POJO類時,不要設定任何屬性默認值。 反例:POJO類的gmtCreate默認值爲new Date(),可是這個屬性在數據提取時並無置入具體值,在更新其它字段時又附帶更新了此字段,致使建立時間被修改爲當前時間。工具

10. 【強制】序列化類新增屬性時,請不要修改serialVersionUID字段,避免反序列失敗;若是徹底不兼容升級,避免反序列化混亂,那麼請修改serialVersionUID值。 說明:注意serialVersionUID不一致會拋出序列化運行時異常。ui

11. 【強制】構造方法裏面禁止加入任何業務邏輯,若是有初始化邏輯,請放在init方法中。

12. 【強制】POJO類必須寫toString方法。使用IDE中的工具:source> generate toString時,若是繼承了另外一個POJO類,注意在前面加一下super.toString。 說明:在方法執行拋出異常時,能夠直接調用POJO的toString()方法打印其屬性值,便於排查問題。

13. 【強制】禁止在 POJO類中,同時存在對應屬性 xxx的 isXxx()和 getXxx()方法。 說明: 框架在調用屬性 xxx

14. 【推薦】使用索引訪問用String的split方法獲得的數組時,需作最後一個分隔符後有無內容的檢查,不然會有拋IndexOutOfBoundsException的風險。

說明:

String str = "a,b,c,,";
String[] ary = str.split(",");
// 預期大於3,結果是3
System.out.println(ary.length);

15. 【推薦】當一個類有多個構造方法,或者多個同名方法,這些方法應該按順序放置在一塊兒,便於閱讀,此條規則優先於第16條規則。

16. 【推薦】 類內方法定義的順序依次是:公有方法或保護方法 > 私有方法 > getter/setter方法。 說明:公有方法是類的調用者和維護者最關心的方法,首屏展現最好;保護方法雖然只是子類關心,也多是「模板設計模式」下的核心方法;而私有方法外部通常不須要特別關心,是一個黑盒實現;由於承載的信息價值較低,全部Service和DAO的getter/setter方法放在類體最後。

17. 【推薦】setter方法中,參數名稱與類成員變量名稱一致,this.成員名 = 參數名。在getter/setter方法中,不要增長業務邏輯,增長排查問題的難度。 反例:

public Integer getData() {
 if (condition) {
 return this.data + 100;
 } else {
 return this.data - 100;
 }
 }

18. 【推薦】循環體內,字符串的鏈接方式,使用StringBuilder的append方法進行擴展。 說明:下例中,反編譯出的字節碼文件顯示每次循環都會new出一個StringBuilder對象,而後進行append操做,最後經過toString方法返回String對象,形成內存資源浪費。

反例:

String str = "start";
for (int i = 0; i < 100; i++) {
 str = str + "hello";
}

19. 【推薦】final能夠聲明類、成員變量、方法、以及本地變量,下列狀況使用final關鍵字:

1) 不容許被繼承的類,如:String類。
 2) 不容許修改引用的域對象。 
3) 不容許被重寫的方法,如:POJO類的setter方法。
4) 不容許運行過程當中從新賦值的局部變量。 5) 避免上下文重複使用一個變量,使用final描述能夠強制從新定義一個變量,方便更好地進行

20. 【推薦】慎用Object的clone方法來拷貝對象。 說明:對象的clone方法默認是淺拷貝,若想實現深拷貝須要重寫clone方法實現域對象的深度遍歷式拷貝。

21. 【推薦】類成員與方法訪問控制從嚴:

1) 若是不容許外部直接經過new來建立對象,那麼構造方法必須是private。 
 2) 工具類不容許有public或default構造方法。
 3) 類非static成員變量而且與子類共享,必須是protected。
 4) 類非static成員變量而且僅在本類使用,必須是private。
 5) 類static成員變量若是僅在本類使用,必須是private。 
 6) 如果static成員變量,考慮是否爲final。
 7) 類成員方法只供類內部調用,必須是private。
 8) 類成員方法只對繼承類公開,那麼限制爲protected。 說明:任何類、方法、參數、變量,嚴控訪問範圍。過於寬泛的訪問範圍,不利於模塊解耦。思考:若是是一個private的方法,想刪除就刪除,但是一個public的service成員方法或成員變量,刪除一下,不得手心冒點汗嗎?變量像本身的小孩,儘可能在本身的視線內,變量做用域太大,無限制的處處跑,那麼你會擔憂的。
相關文章
相關標籤/搜索