一文詳解Java屬性為什么不能是is開頭的boolean
通常定義Java實(shí)體類時(shí),對(duì)于boolean屬性,阿里規(guī)約中明確要求不能使用is開頭。
至于為什么,我們稍后再講。
這里先講一下前幾天在工作中,項(xiàng)目遇到的一個(gè)問題。庫表中某個(gè)字段存入了一個(gè)實(shí)體類的json字符串,在查詢庫表后,需要將json字符串轉(zhuǎn)為實(shí)體類對(duì)象進(jìn)行更改后再轉(zhuǎn)為json字符串后返回給前端。
在這當(dāng)中就出現(xiàn)了一個(gè)問題,庫表中存入的數(shù)據(jù)明明是isUpdate的字段,可是在返回到前端后的代碼就是update。
這個(gè)問題,起初并沒有想到是字段定義的問題,通過一步一步的debug,最后才發(fā)現(xiàn)是實(shí)體類中isUpdate字段的問題,在通過json解析后就轉(zhuǎn)成了update返回給了前端。
下面講一下,為什么會(huì)出現(xiàn)isUpdate變成update的問題。
首先,我們先定義一個(gè)Java實(shí)體類,包含一個(gè)is開頭的屬性,如isSuccess,再使用idea自動(dòng)生成的get/set,看看是什么樣子。
public class IsEntity1 { private boolean isSuccess; public boolean isSuccess() { return isSuccess; } public void setSuccess(boolean success) { isSuccess = success; } }
然后再定義一個(gè)Java實(shí)體類,不是用is開頭的屬性,如success,再使用idea自動(dòng)生成的get/set,看看是什么樣子。
public class IsEntity2 { private boolean success; public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } }
此時(shí),會(huì)發(fā)現(xiàn)無論你是用is開頭或者不用is開頭定義屬性,使用idea自動(dòng)生成的get/set都是一個(gè)樣子的,而且在setSuccess的時(shí)候,會(huì)將is省略掉。這里就是項(xiàng)目中遇到的問題所在。
因?yàn)楫?dāng)類進(jìn)行序列化時(shí),有些框架的序列化會(huì)根據(jù)JavaBean的屬性進(jìn)行序列化,而部分框架是根據(jù)JavaBean的getter方法進(jìn)行序列化,這就會(huì)導(dǎo)致在反序列化時(shí)與實(shí)體類的屬性對(duì)應(yīng)不上。
比如說將IsEntity1轉(zhuǎn)換為json字符串時(shí),會(huì)根據(jù)實(shí)體類中的get方法進(jìn)行序列化取isSuccess的值,而使用idea自動(dòng)生成的get方法直接就是public boolean isSuccess()方法,在取值的時(shí)候會(huì)認(rèn)定success是字段名,就會(huì)取成success,與原來定義的字段不同。
如果非要使用is開頭來定義字段,怎么才能保證json解析過程是正確的呢
答案是自己寫get方法,不用idea自動(dòng)生成的get方法。
如下:
public boolean getIsSuccess() { return isSuccess; }
這樣,再將實(shí)體類轉(zhuǎn)為json字符串時(shí),就會(huì)認(rèn)定isSuccess是字段名。
還有一種方法,就是使用JSONField注解
@JSONField(name = "isSuccess") private boolean isSuccess;
雖然這些方法都可以解決json解析過程丟失is的問題,但是為了避免出現(xiàn)這種問題,我們最好還是遵守規(guī)約,不使用is開頭定義字段。
總結(jié)
到此這篇關(guān)于Java屬性為什么不能是is開頭的boolean的文章就介紹到這了,更多相關(guān)Java屬性不能是is開頭的boolean內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java之idea @NotNull @Nullable 注解使用
這篇文章主要介紹了Java之idea @NotNull @Nullable 注解使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01spring-data-redis連接操作redis的實(shí)現(xiàn)
spring-data-redis則是對(duì)Jedis進(jìn)行了高度封裝,使用起來非常方便。本文主要介紹了spring-data-redis連接操作redis的實(shí)現(xiàn),感興趣的可以了解一下2021-07-07SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的切換實(shí)踐
這篇主要介紹了SpringBoot實(shí)現(xiàn)多數(shù)據(jù)源的切換,本文基于AOP來實(shí)現(xiàn)數(shù)據(jù)源的切換,文中通過示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下2022-03-03Java實(shí)現(xiàn)Timer的定時(shí)調(diào)度函數(shù)schedule的四種用法
本文主要介紹了Java實(shí)現(xiàn)Timer的定時(shí)調(diào)度函數(shù)schedule的四種用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04SpringBoot實(shí)現(xiàn)多文件上傳的詳細(xì)示例代碼
文件上傳中并沒有什么太多的知識(shí)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)多文件上傳的詳細(xì)示例,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03使用Stargate訪問K8ssandra的過程之Springboot整合Cassandra
這篇文章主要介紹了使用Stargate訪問K8ssandra的過程之Springboot整合Cassandra,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10springBoot2.6.2自動(dòng)裝配之注解源碼解析
對(duì)于springboot個(gè)人認(rèn)為它就是整合了各種組件,然后提供對(duì)應(yīng)的自動(dòng)裝配和啟動(dòng)器(starter),基于這個(gè)流程去實(shí)現(xiàn)一個(gè)定義的裝配組件,下面這篇文章主要給大家介紹了關(guān)于springBoot2.6.2自動(dòng)裝配之注解源碼解析的相關(guān)資料,需要的朋友可以參考下2022-01-01