Java開發規範之OOP規約篇(下)

開發規範是所有程序員開發過程中必須掌握的技能,早期的軟件開發過程可能不重視開發規範導致後期維護成本極高,現在國內的大廠都會制定自己的開發規範,完善的開發規範不僅可以提高團隊效率,還可以避免很多意外的bug問題。下面我找了幾篇關於代碼規範重要性的文章,大家可以參考下。

  1. 爲什麼谷歌要執行嚴格的代碼編寫規範
  2. 爲什麼要寫軟件開發規範?軟件開發規範書怎麼寫?
  3. 爲什麼在程序開發中要注意編碼規範?(知乎問答)

本系列文章將整合 阿里巴巴《Java開發手冊》 和  谷歌《Java編程規範》 ,總結Java開發過程的編碼規範,並通過具體編碼案例給出編碼規範的原因,如果總結內容存在問題還望指出。


Java開發規範之OOP規約篇共上中下三篇,具體內容參考 阿里巴巴《Java開發手冊》的目錄,同時補充 谷歌《Java編程規範》的內容,阿里巴巴規約內容比較豐富,谷歌規約很多實際內容都沒有。

  1. Java開發規範之OOP規約篇(上)
  2. Java開發規範之OOP規約篇(中)
  3. Java開發規範之OOP規約篇(下)

Java開發規範之OOP規約篇(下)

17.String的split方法需作空檢查

18.類的同名方法需要順序放在一起

19.類內方法定義的順序 public / protected > private > getter / setter

20.setter方法中參數名稱與類成員變量名稱一致

21.字符串的拼接使用StringBuilder的append方法

22.final關鍵字使用標準

23.避免使用Object的clone方法拷貝對象

24.類成員與方法訪問控制標準


本篇文章內容將承接上一篇  《Java開發規範之OOP規約篇(中)》  繼續介紹面向對象程序設計中規範,如果OOP (Object Oriented Programming)含義不夠了解,請參考第一篇文章介紹內容。

17.String的split方法需作空檢查

Alibaba規約(推薦

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

Google規約

未明確定義類似規範

說明:str字符串中包含多個元素,被逗號分隔,但最後兩個逗號後無內容,本來是想挑出a,b,c,null,null,但實際結果有差錯,如果使用array[4]訪問第五個元素就存在問題。

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

正例:

String str = "a,b,c,,";
String[] array = str.split(",");
for (int i = 0; i < 5; i++) {
    // 內容檢查
    if (array[i] != null){
        System.out.println(array[i]);
    }
}

18.類的同名方法需要順序放在一起

Alibaba規約(推薦

當一個類有多個構造方法,或者多個同名方法,這些方法應該按順序放置在一起,便於閱讀,此條規則優先於下一條。

Google規約

未明確定義類似規範

說明:同名方法一般是相同業務邏輯但參數不同,因此放在一起增加可讀性,讓後人查看不至於漏掉關鍵信息。

19.類內方法定義的順序 public / protected > private > getter / setter

Alibaba規約(推薦

類內方法定義的順序依次是:公有方法或保護方法 > 私有方法 > getter / setter 方法。

Google規約

未明確定義類似規範

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

 

20.setter方法中參數名稱與類成員變量名稱一致

Alibaba規約(推薦

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

Google規約

未明確定義類似規範

說明:setter方法是用來設置成員變量,按照該規則可以避免低級問題。

正例:

public void setName(String name) {
	this.name = name;
}

public void setAge(Integer age) {
	this.age = age;
}

反例:

public void setName(String str) {
	this.name = str;
}

public void setAge(Integer num) {
	this.age = num;
}

21.字符串的拼接使用StringBuilder的append方法

Alibaba規約(推薦

循環體內,字符串的連接方式,使用StringBuilder的append方法進行擴展。

Google規約

未明確定義類似規範

說明:如果直接使用 + “123” 方法都會new出一個StringBuilder對象,然後進行append操作,最後通過toString方法返回String對象,造成內存資源浪費。

正例:

StringBuilder str = new StringBuilder("start");
for (int i = 0; i < 100; i++) {
	str.append("hello");
}

反例:

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

22.final關鍵字使用標準

Alibaba規約(推薦

final可以聲明類、成員變量、方法、以及本地變量,下列情況使用final關鍵字:

  •  不允許被繼承的類,如:String類。
  •  不允許修改引用的域對象。
  •  不允許被覆寫的方法,如:POJO類的setter方法。
  •  不允許運行過程中重新賦值的局部變量。
  • 避免上下文重複使用一個變量,使用final可以強制重新定義一個變量,方便更好地進行重構。

Google規約

未明確定義類似規範

說明:final 在Java中是一個保留的關鍵字,可以聲明成員變量、方法、類以及本地變量。一旦引用聲明作final,將不能改變這個引用了,編譯器會檢查代碼,如果試圖將變量再次初始化的話,編譯器會報編譯錯誤。final 關鍵字有以下作用:

  • 修飾數據,包括成員變量和局部變量,該變量只能被賦值一次且它的值無法被改變。對於成員變量來講,我們必須在聲明時或者構造方法中對它賦值;
  • 修飾方法參數,表示在變量的生存期中它的值不能被改變;
  • 修飾方法,表示該方法無法被重寫;
  • 修飾類,表示該類無法被繼承。

23.避免使用Object的clone方法拷貝對象

Alibaba規約(推薦

慎用Object的clone方法來拷貝對象。

Google規約

未明確定義類似規範

說明:對象clone方法默認是淺拷貝,若想實現深拷貝需覆寫clone方法實現域對象的深度遍歷式拷貝。

24.類成員與方法訪問控制標準

Alibaba規約(推薦

類成員與方法訪問控制從嚴:

  • 如果不允許外部直接通過new來創建對象,那麼構造方法必須是private。
  • 工具類不允許有public或default構造方法。
  • 類非static成員變量並且與子類共享,必須是protected。
  • 類非static成員變量並且僅在本類使用,必須是private。
  • 類static成員變量如果僅在本類使用,必須是private。
  •  若是static成員變量,考慮是否爲final。
  • 類成員方法只供類內部調用,必須是private。
  •  類成員方法只對繼承類公開,那麼限制爲protected。

Google規約

未明確定義類似規範

說明:任何類、方法、參數、變量,嚴控訪問範圍。過於寬泛的訪問範圍,不利於模塊解耦。思考:如果是一個private的方法,想刪除就刪除,可是一個public的service成員方法或成員變量,刪除一下,不得手心冒點汗嗎?變量像自己的小孩,儘量在自己的視線內,變量作用域太大,無限制的到處跑,那麼你會擔心的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章