阿里規範:爲什麼boolean類型變量命名禁用is開頭

歡迎你們關注 github.com/hsfxuebao/j… ,但願對你們有所幫助,要是以爲能夠的話麻煩給點一下Star哈html

轉自:www.cnblogs.com/Zzwena/p/13…前端

一般定義Java實體類時,對於boolean屬性,阿里規約中明確要求不能使用is開頭。java

至於爲何,咱們稍後再講。git

這裏先講一下前幾天在工做中,項目遇到的一個問題。庫表中某個字段存入了一個實體類的json字符串,在查詢庫表後,須要將json字符串轉爲實體類對象進行更改後再轉爲json字符串後返回給前端。github

在這當中就出現了一個問題,庫表中存入的數據明明是isUpdate的字段,但是在返回到前端後的代碼就是update
這個問題,起初並無想到是字段定義的問題,經過一步一步的debug,最後才發現是實體類中isUpdate字段的問題,在經過json解析後就轉成了update返回給了前端。json

下面講一下,爲何會出現isUpdate變成update的問題。

首先,咱們先定義一個Java實體類,包含一個is開頭的屬性,如isSuccess,再使用idea自動生成的get/set,看看是什麼樣子。markdown

public class IsEntity1 {

    private boolean isSuccess;   
    
    public boolean isSuccess() {
    	return isSuccess;        
    }  
    
    public void setSuccess(boolean success) {
    	isSuccess = success;        
    }   
    
}
複製代碼

而後再定義一個Java實體類,不是用is開頭的屬性,如success,再使用idea自動生成的get/set,看看是什麼樣子。框架

public class IsEntity2 {

    private boolean success;

    public boolean isSuccess() {
        return success;
    }

    public void setSuccess(boolean success) {
        this.success = success;
    }
    
}
複製代碼

此時,會發現不管你是用is開頭或者不用is開頭定義屬性,使用idea自動生成的get/set都是一個樣子的,並且在setSuccess的時候,會將is省略掉。這裏就是項目中遇到的問題所在。ide

由於當類進行序列化時,有些框架的序列化會根據JavaBean的屬性進行序列化,而部分框架是根據JavaBean的getter方法進行序列化,這就會致使在反序列化時與實體類的屬性對應不上。函數

好比說將IsEntity1轉換爲json字符串時,會根據實體類中的get方法進行序列化取isSuccess的值,而使用idea自動生成的get方法直接就是public boolean isSuccess()方法,在取值的時候會認定success是字段名,就會取成success,與原來定義的字段不一樣。

若是非要使用is開頭來定義字段,怎麼才能保證json解析過程是正確的呢

答案是本身寫get方法,不用idea自動生成的get方法。

以下:

public boolean getIsSuccess() {
	return isSuccess;
}
複製代碼

這樣,再將實體類轉爲json字符串時,就會認定isSuccess是字段名。

還有一種方法,就是使用JSONField註解

@JSONField(name = "isSuccess")
    private boolean isSuccess;
複製代碼

雖然這些方法均可以解決json解析過程丟失is的問題,可是爲了不出現這種問題,咱們最好仍是遵照規約,不使用is開頭定義字段。

分析:

申明屬性,而後用idea自帶的Generator生成getter,setter(封裝類型和基本數據類型生成的還不同),以下:

當我去構造一個PropertyDescriptor時,會報錯

後來跟代碼,發現,報錯緣由是PropertyDescriptor的構造函數去找一個叫setIsSuccess的寫值函數時,發現找不到,因而報錯了。

從上圖能夠看到,實際在構造PropertyDescriptor時,它會嘗試去尋找一個叫isIsSuccess的讀函數,一個叫setIsSuccess的寫函數。當isIsSuccess沒找到時,它會嘗試去找叫getIsSuccess的讀函數,若是仍是沒找到,則拋出異常。當setIsSuccess沒找到時,也會拋出異常。

試了一下發現,用idea自動生成getter,setter只有在使用is打頭的boolean時有這個問題(封裝類型和基本數據類型都有問題),其餘數據類型沒有這個問題。

這方面的問題有時還涉及到json轉換,因此在處理布爾類型數據時,又用is打頭來命名時,不要使用idea自動生成getter和setter。另外,行業裏好像比較合理的作法是禁止Bean裏用is打頭申明boolean類型的變量。

相關文章
相關標籤/搜索