1.4 OOP 規約

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

2.強制:所有的覆寫方法,必須加 @Override 註解。

        說明:getObject() 與 get0boject() 的問題。一個是字母 o , 一個是數字 0 , 加 @Override 可以準確判斷是否覆蓋成功。

                  另外,如果在抽象類中對方法簽名進行修改,其實現類會馬上編譯出錯。

3.強制:相同參數類型,相同業務含義,纔可以使用 Java 的可變參數,避免使用 Object .

        說明:可變參數必須放置在參數列表的最後(建議工程師們儘量不用可變參數編程)。

        正例:pubic 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.Object#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 fangfa1 ,在使用 IDE 中的工具 source>generater toString 時,如果繼承了另一個                      POJO類,注意在前邊加一下 super.toString。

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

13.推薦:當使用索引訪問用 String 的 split 方法得到的數組時,需在最後一個分隔符後做有無內容的檢查,否則會有拋出異常                   IndexOutOfBoudsException 的風險。          

說明:

    String str = "a, b, c, ";

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

    // 預期大於 3,結果是 3

    System.out.println(ary.length);

14.推薦:當一個類有多個構造方法,或者多個同名方法是,這些方法應該按照順序放置在一起,便於閱讀,此條規則優先於本節              的第 15 條規則。

15.推薦:類內方法定義的順序是:公有方法或保護方法 > 私有方法 > getter / setter 方法。

說明:公有方法是類的調用者和維護者最關心的方法,首屏展示最好;保護方法雖然只有子類關心,打呢可能是“模板設計模式”下的核心方法;而私有方法外部一般不需要特別關心,是一個黑盒實現;因爲承載的信息價值較低,所有 Service 和 DAO 的 getter / setter 方法放在類體最後。

16.推薦:在 setter 方法中,參數名稱與類成員變量名稱一致,this.成員名 = 參數名。在 getter / setter 方法中,不要增加業務               邏輯,否則會增加排查問題的難點。

           反例:

                public Integer getDate(){

                    if(condition){

                            return this.data + 100;

                    }else {

                            return this.data - 100;

                    }

                }

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

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

反例:

        String str = "start";

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

                str = str + "hello";

        }

18.推薦:final 可以聲明類、成員變量、方法及本地變量,

下列情況使用 final 關鍵字:

  1. 不允許被繼承的類,如:String 類。
  2. 不允許修改引用的與對象,如:POJO 類的域變量。
  3. 不允許被重寫的方法,如:POJO 類的 setter 方法。
  4. 不允許運行過程中重新複製的局部變量。
  5. 避免上線文重複使用一個變量,使用 final 描述可以強制重新定義一個變量,方便更好的進行重構。

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 的成員變量,刪除時手心不得冒點汗嗎?變量想自己的小孩,應儘量讓它在自己的視線範圍內。變量作用域太大,如果任其無限制地到處跑,你會擔心的。
















發佈了4 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章