Java屬性為什麼不能是is開頭的boolean
通常定義Java實體類時,對于boolean屬性,阿裡規約中明确要求不能使用is開頭。

至于為什麼,我們稍後再講。
這裡先講一下前幾天在工作中,項目遇到的一個問題。庫表中某個字段存入了一個實體類的json字元串,在查詢庫表後,需要将json字元串轉為實體類對象進行更改後再轉為json字元串後傳回給前端。
在這當中就出現了一個問題,庫表中存入的資料明明是isUpdate的字段,可是在傳回到前端後的代碼就是update。
這個問題,起初并沒有想到是字段定義的問題,通過一步一步的debug,最後才發現是實體類中isUpdate字段的問題,在通過json解析後就轉成了update傳回給了前端。
下面講一下,為什麼會出現isUpdate變成update的問題。
首先,我們先定義一個Java實體類,包含一個is開頭的屬性,如isSuccess,再使用idea自動生成的get/set,看看是什麼樣子。
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省略掉。這裡就是項目中遇到的問題所在。
因為當類進行序列化時,有些架構的序列化會根據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開頭定義字段。
010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101