01_編程規約——OOP規約


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

 

2.【強制】所有的覆蓋方法,必須加@Override注解

說明:加@Override可以准確判斷是否覆蓋成功,另外如果在抽象類中對方法簽名進行修改,對應的實現類會馬上報編譯錯誤。

 

3.【強制】相同的參數類型,相同業務含義,才可以使用Java的可變參數(Integer... ids),避免使用Object。(注意:盡量不要用可變參數編程)

說明:可變參數必須放在參數列表的最后。

非得使用的話,例子:public User getUsers(String type, Integer... ids){...}

 

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

 

5.【強制】不能使用過時的類和方法。

 

6.【強制】Object的equals方法容易拋空指針異常,應該使用常量或者確定有值的對象來調用equals方法。

正例:"test".equals(object)

反例:object.equals("test")

說明:推薦使用java.util.Objects#equals

 

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

說明:對於Integer var= ? 在-128至127范圍內的賦值,Integer對象是在IntegerCache.cache產生, 產生,會復用已有對象,在這個區間的值可以直接使用==進行判斷,但是這個區間之外的數據,都會在堆上產生,並不會復用已有對象,是一個大坑,推薦使用equals方法進行判斷。

 

8.關於數據基本類型與包裝數據類型的使用標准如下:

  8.1【強制】所有的POJO類屬性必須使用包裝數據類型。

  8.2【強制】RPC方法的返回值和參數必須使用包裝數據類型。

  8.3【推薦】所有的局部變量使用基本數據類型。

說明:POJO類屬性沒有初值是提醒使用者在需要使用時,必須自己顯式地進行賦值,任何NPE問題,或者入庫檢查,都由使用者來保證。

正例:數據庫的查詢結果可能是null,因為自動拆箱,用基本數據類型接收會有NPE風險。

反例:比如成交總額的漲跌情況,即為±x%,x為基本數據類型,在調用RPC服務,調用不成功時,返回的是默認值,頁面顯示為±0%,這是不合理的,應該顯示成中划線-,所以包裝數據類型的null值,能夠表示額外的信息,如遠程調用失敗,異常退出。

 

9.【強制】定義DO/DTO/VO等POJO類時,不要設定任何屬性為默認值。

反例:POJO類的gmtCreate默認值為new Date(),但是這個屬性在數據提取時並沒有置入具體值,在更新其他字段時又附帶更新了此字段,導致創建時間被修改成當前時間。

 

10.【強制】序列化類新增屬性時,不要修改serialVersionUID字段,避免反序列化失敗:如果完全不兼容升級,避免反序列化混亂,那么修改serialVersionUID值。

說明:注意serialVersionUID不一致會拋出序列化運行時異常。

 

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

 

12.【推薦】POJO類必須寫toString()方法。

如果繼承了另一個POJO類時,注意在前面加一下super.toString()。

說明:在方法執行拋出異常時,可以直接調用POJO的toString()方法打印其屬性值,便於排查問題。

 

13.【推薦】使用索引訪問String的split方法得到的數組,需要做最后一個分隔符后有無內容的檢查,否則會有拋出IndexOutOfBoundsException數組越界的風險。

說明:String str = "a,b,c,,";

  String[] ary = str.split(",");

  System.out.println(ary.length); //預期是大於3,但是結果是3。

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

15.【推薦】類內方法的定義的放置順序依次是:public/protected方法>private方法>getter/setter方法。

說明:public方法是類的調用者和維護者最關心的方法,首屏展示最好。

protected方法雖然只是子類關心,但是也有可能是“模板設計模式”下的核心方法。

private方法外部一般不需要特別關心,是一個黑盒實現。

 

16.【推薦】setter方法中,參數名稱與類成員變量名稱保持一致,this.成員變量=參數名。

在getter/setter方法中,盡量不要增加業務邏輯,增加排查問題的難度。

 

17.【推薦】循環體內,字符串的連接方式,使用StringBuilder的append方法進行擴展。

說明:反編譯出的字節碼文件顯示使用String時,每次循環都會new出一個新的StringBuilder對象,然后進行append操作,最后toString方法會返回String對象,造成內存資源的浪費。

反例:

String str = "start";

for(int i=0;i<100;i++){

  str = str + "hello";

}

 

18.【推薦】final可以聲明類,成員變量,方法,以及本地變量,下列情況使用final關鍵字:

  18.1 不允被繼承的類,如String類。

  18.2 不允許修改引用的域對象,如POJO類的域對象。

  18.3 不允許被重寫的方法,如POJO類的setter方法。

  18.4 不允許運行過程匯總重新賦值的局部變量。

  18.5 避免上下文重復使用一個一個變量,使用final描述可以強制重新定義一個變量,方便更好地進行重構。

 

19.【推薦】謹慎使用Object的clone方法來拷貝對象。

說明:對象的clone方法默認是淺拷貝,若想實現深拷貝需要重寫clone方法數顯屬性對象的拷貝。

 

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

  20.1 如果不允許外部直接通過new來創建對象,那么構造方法必須是private。

  20.2 工具類不允許有public或default構造方法(工具類一般所有方法都是靜態方法)。

  20.3 類非static 成員變量並且與子類共享,必須是protected。

  20.4 類非static成員變量並且僅在本類使用,必須是private

  20.5 類static 成員變量如果盡在本類使用,必須是private

  20.6 若是static成員變量,必須考慮是否為final

  20.7 類成員方法只供類內部使用,必須是private

  20.8 類成員方法只對繼承公開,那么限制為protected

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM