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

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

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

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


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

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

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

9.DO類屬性必須匹配數據庫字段類型

10.double值轉化爲BigDecimal對象禁止直接使用構造方法

11.基本數據類型與包裝數據類型的使用標準

12.POJO類禁止設定任何屬性默認值

13.序列化類儘量避免修改serialVersionUID字段

14.構造方法禁止加入任何業務邏輯

15.POJO類必須寫toString方法

16.POJO類中禁止存在對應屬性xxx的isXxx()和getXxx()方法


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

9.DO類屬性必須匹配數據庫字段類型

Alibaba規約(強制

定義數據對象DO類時,屬性類型要與數據庫字段類型相匹配。

Google規約

未明確定義類似規範

說明:DO(Domain Object)領域對象一般是指從現實世界中抽象出來的有形或無形的業務實,常和數據中的表結構對應,如數據庫中有一個 Student 學生表,對應程序中需要有一個學生類存儲對應數據,可記作 StudentDO。Java實體類的屬性類型與數據庫表字段類型對應表可以參考這篇文章,點擊 鏈接 跳轉查看。

正例:數據庫字段的bigint必須與類屬性的Long類型相對應。

反例::某個案例的數據庫表id字段定義類型bigint unsigned,實際類對象屬性爲Integer,隨着id越來越大,超過Integer的表示範圍而溢出成爲負數。

10.double值轉化爲BigDecimal對象禁止直接使用構造方法

Alibaba規約(強制

爲了防止精度損失,禁止使用構造方法BigDecimal(double)的方式把double值轉化爲BigDecimal對象。

Google規約

未明確定義類似規範

說明:BigDecimal(double)存在精度損失風險,在精確計算或值比較的場景中可能會導致業務邏輯異常。如:BigDecimal g = new BigDecimal(0.1f); 實際的存儲值爲:0.10000000149

正例:優先推薦入參爲String的構造方法,或使用BigDecimal的valueOf方法,此方法內部其實執行了Double的toString,而Double的toString按double的實際能表達的精度對尾數進行了截斷。

BigDecimal recommend1 = new BigDecimal("0.1"); 
BigDecimal recommend2 = BigDecimal.valueOf(0.1);

反例:

BigDecimal number = new BigDecimal(0.1);

System.out.println("number=" + number);
// 輸出結果  number=0.1000000000000000055511151231257827021181583404541015625

11.基本數據類型與包裝數據類型的使用標準

Alibaba規約

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

  • 強制】所有的POJO類屬性必須使用包裝數據類型。
  • 強制】RPC方法的返回值和參數必須使用包裝數據類型。
  • 推薦】所有的局部變量使用基本數據類型。

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

Google規約

未明確定義類似規範

說明:POJO是Plain OrdinaryJava Object的縮寫,可以簡單理解爲不包含業務邏輯的單純用來存儲數據的 Java類(實際就是普通JavaBean,是爲了避免和EJB混淆所創造的簡稱)。使用POJO名稱是爲了避免和EJB混淆起來, 而且簡稱比較直接. 其中有一些屬性及其getter setter方法的類,沒有業務邏輯,有時可以作爲VO(value -object)或DTO(Data Transform Object)來使用。

正例:數據庫的查詢結果可能是null,因爲自動拆箱,用基本數據類型接收有空指針異常風險。

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

12.POJO類禁止設定任何屬性默認值

Alibaba規約(強制

定義DO/DTO/VO等POJO類時,不要設定任何屬性默認值

Google規約

未明確定義類似規範

說明:VO(View Object,視圖對象)一般作用於前臺頁面與表示層之間,將所有的數據封裝到一起,比如表單數據,這些參數並不一定完全與數據庫中表的所有字段均匹配。DTO(Data Transfer Object,數據傳輸對象)作用於表示層與業務層之間,Action/Controller將接收到的VO對象進行業務邏輯處理,轉化或者構造成DTO對象將其傳遞給service層。DO(Domain Object,領域對象)作用於業務層與dao層之間,service層使用接收到的DTO數據傳輸對象構造或者重構DO對象,傳遞到DAO層。DAO(data access object,數據訪問對象),負責數據庫的操作併爲service層提供接口。

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

13.序列化類儘量避免修改serialVersionUID字段

Alibaba規約(強制

序列化類新增屬性時,請不要修改serialVersionUID字段,避免反序列失敗;如果完全不兼容升級,避免反序列化混亂,那麼請修改serialVersionUID值。

Google規約

未明確定義類似規範

說明:serialVersionUID 用來表明類的不同版本間的兼容性,serialVersionUID不一致會拋出序列化運行時異常。

補充: Java的序列化機制是通過在運行時判斷類的serialVersionUID來驗證版本一致性的。在進行反序列化時,JVM會把傳來的字節流中的serialVersionUID與本地相應實體(類)的serialVersionUID進行比較,如果相同就認爲是一致的,可以進行反序列化,否則就會出現序列化版本不一致的異常。當實現java.io.Serializable接口的實體(類)沒有顯式地定義一個名爲serialVersionUID,類型爲long的變量時,Java序列化機制會根據編譯的class自動生成一個serialVersionUID作序列化版本比較用,這種情況下,只有同一次編譯生成的class纔會生成相同的serialVersionUID 。

14.構造方法禁止加入任何業務邏輯

Alibaba規約(強制

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

Google規約

未明確定義類似規範

說明:構造方法一般是類的初始化方法,如果加入業務邏輯代碼將非常影響可讀性,如果有必須的初始化操作方法可以創建init方法進行操作。

15.POJO類必須寫toString方法

Alibaba規約(強制

POJO類必須寫toString方法。使用IDE中的工具:source> generate toString時,如果繼承了另一個POJO類,注意在前面加一下super.toString。

Google規約

未明確定義類似規範

說明:在方法執行拋出異常時,可以直接調用POJO的toString()方法打印其屬性值,便於排查問題。使用lombok框架可以自動生成該方法,但有部分人認爲該框架存在隱患。

 

16.POJO類中禁止存在對應屬性xxx的isXxx()和getXxx()方法

Alibaba規約(強制

禁止在POJO類中,同時存在對應屬性xxx的isXxx()和getXxx()方法。

Google規約

未明確定義類似規範

說明:框架在調用屬性xxx的提取方法時,並不能確定哪個方法一定是被優先調用到。Mybatis 和 Hibernate 框架是根據獲取方法找到對應屬性,因此上述定義可能存在問題。

 

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