1. 程式人生 > >JAVA編程規範-OOP規範

JAVA編程規範-OOP規範

同名 text equals方法 編譯 分隔符 tostring 方法簽名 設定 enc

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


2.【強制】所有的覆寫方法,[email protected]
反例:getObject()與 get0bject()的問題。一個是字母的 O,一個是數字的 0,[email protected]
可以準確判斷是否覆蓋成功。另外,如果在抽象類中對方法簽名進行修改,其實現類會馬上編
譯報錯。


3.【強制】相同參數類型,相同業務含義,才可以使用 Java的可變參數,避免使用 Object。
說明:可變參數必須放置在參數列表的最後。(提倡同學們盡量不用可變參數編程)
正例:public User getUsers(String type, Integer... ids)


4.【強制】對外暴露的接口簽名,原則上不允許修改方法簽名,避免對接口調用方產生影響。接
[email protected],並清晰地說明采用的新接口或者新服務是什麽。

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


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


equals。
正例: "test".equals(object);
反例: object.equals("test");

說明:推薦使用 java.util.Objects#equals (JDK7引入的工具類)


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值,能夠表示額外的信息,如:遠程調用失敗,異常退出。


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


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


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


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


13.【推薦】使用索引訪問用 String的 split方法得到的數組時,需做最後一個分隔符後有無
內容的檢查,否則會有拋 IndexOutOfBoundsException的風險。
說明:
String str = "a,b,c,,";
String[] ary = str.split(",");
//預期大於 3,結果是 3
System.out.println(ary.length);


14.【推薦】當一個類有多個構造方法,或者多個同名方法,這些方法應該按順序放置在一起,
便於閱讀。

15.【推薦】 類內方法定義順序依次是:公有方法或保護方法 > 私有方法 > getter/setter
方法。
說明:公有方法是類的調用者和維護者最關心的方法,首屏展示最好;保護方法雖然只是子類
關心,也可能是“模板設計模式”下的核心方法;而私有方法外部一般不需要特別關心,是一個
黑盒實現;因為方法信息價值較低,所有 Service和 DAO的 getter/setter方法放在類體最
後。


16.【推薦】setter方法中,參數名稱與類成員變量名稱一致,this.成員名=參數名。在
getter/setter方法中,盡量不要增加業務邏輯,增加排查問題的難度。
反例:
public Integer getData(){
if(true) {
return data + 100;
} else {
return data - 100;
}
}


17.【推薦】循環體內,字符串的聯接方式,使用 StringBuilder的 append方法進行擴展。
反例:
String str = "start";
for(int i=0; i<100; i++){
str = str + "hello";
}
說明:反編譯出的字節碼文件顯示每次循環都會 new出一個 StringBuilder對象,然後進行
append操作,最後通過 toString方法返回 String對象,造成內存資源浪費。


18.【推薦】final可提高程序響應效率,聲明成 final的情況:
1) 不需要重新賦值的變量,包括類屬性、局部變量。
2) 對象參數前加 final,表示不允許修改引用的指向。
3) 類方法確定不允許被重寫。


19.【推薦】慎用 Object的 clone方法來拷貝對象。
說明:對象的 clone方法默認是淺拷貝,若想實現深拷貝需要重寫 clone方法實現屬性對象
的拷貝。

20.【推薦】類成員與方法訪問控制從嚴:
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方法,或者一
個 public的成員變量,刪除一下,不得手心冒點汗嗎?變量像自己的小孩,盡量在自己的視
線內,變量作用域太大,如果無限制的到處跑,那麽你會擔心的。

JAVA編程規範-OOP規範