0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

新來(lái)個(gè)技術(shù)總監(jiān):誰(shuí)在用isXxx形式定義布爾類(lèi)型年后不用來(lái)了

jf_ro2CN3Fa ? 來(lái)源:Hollis ? 2023-06-11 16:00 ? 次閱讀


在日常開(kāi)發(fā)中,我們會(huì)經(jīng)常要在類(lèi)中定義布爾類(lèi)型的變量,比如在給外部系統(tǒng)提供一個(gè)RPC接口的時(shí)候,我們一般會(huì)定義一個(gè)字段表示本次請(qǐng)求是否成功的。

關(guān)于這個(gè)”本次請(qǐng)求是否成功”的字段的定義,我見(jiàn)過(guò)很多不同的開(kāi)發(fā)者,定義的方式都不同,尤其是在屬性的命名上,有人用 success,有人用 isSuccess 表示。

從語(yǔ)義上面來(lái)講,兩種命名方式都可以講的通,并且也都沒(méi)有歧義。那么還有什么原則可以參考來(lái)讓我們做選擇呢。

根據(jù)JavaBeans Specification規(guī)定,如果是普通的參數(shù)propertyName,要以以下方式定義其setter/getter:

publicget();

publicvoidset(a);

但是,布爾類(lèi)型的變量propertyName則是單獨(dú)定義的:

publicbooleanis();

publicvoidset(booleanm);

success方法的 getter 應(yīng)該是isSuccess/getSuccess,而isSuccess的getter 應(yīng)該是isIsSuccess/getIsSuccess。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

但是很多人,在使用isSuccess作為屬性名的時(shí)候,還是會(huì)采用isSuccess/getSuccess作為 getter 方法名,尤其是現(xiàn)在的很多 IDE 在默認(rèn)生成 getter 的時(shí)候也是會(huì)生成isSuccess。

在一般情況下,其實(shí)是沒(méi)有影響的。但是有一種特殊情況就會(huì)有問(wèn)題,那就是發(fā)生序列化的時(shí)候可能會(huì)導(dǎo)致參數(shù)轉(zhuǎn)換異常。

我們先來(lái)定義一個(gè) JavaBean:

classModelimplementsSerializable{


privatestaticfinallongserialVersionUID=1836697963736227954L;

privatebooleanisSuccess;

publicbooleanisSuccess(){

returnisSuccess;

}

publicvoidsetSuccess(booleansuccess){

isSuccess=success;

}

publicStringgetHollis(){

return"yudaoyuanma";

}

}

在這個(gè) JavaBean 中,有一個(gè)成員變量isSuccess,三個(gè)方法,分別是IDE幫我們自動(dòng)生成的isSuccess和setSuccess,另外一個(gè)是作者自己增加的一個(gè)符合getter命名規(guī)范的方法。

我們分別使用不同的 JSON 序列化工具來(lái)對(duì)這個(gè)類(lèi)的對(duì)象進(jìn)行序列化和反序列化:

publicclassBooleanMainTest{

publicstaticvoidmain(String[]args)throwsIOException{

//定一個(gè)Model類(lèi)型

Modelmodel=newModel();

model.setSuccess(true);



//使用fastjson(1.2.16)序列化model成字符串并輸出

System.out.println("SerializableResultWithfastjson:"+JSON.toJSONString(model));



//使用Gson(2.8.5)序列化model成字符串并輸出

Gsongson=newGson();

System.out.println("SerializableResultWithGson:"+gson.toJson(model));



//使用jackson(2.9.7)序列化model成字符串并輸出

ObjectMapperom=newObjectMapper();

System.out.println("SerializableResultWithjackson:"+om.writeValueAsString(model));

}

}

以上代碼輸出結(jié)果:

SerializableResultWithfastjson:{"yudao":"yudaoyuanma","success":true}

SerializableResultWithGson:{"isSuccess":true}

SerializableResultWithjackson:{"success":true,"yudao":"yudaoyuanma"}

在fastjson和jackson的結(jié)果中,原來(lái)類(lèi)中的isSuccess字段被序列化成success,并且其中還包含yudao值。而Gson中只有isSuccess字段。

我們可以得出結(jié)論:fastjson和jackson在把對(duì)象序列化成json字符串的時(shí)候,是通過(guò)反射遍歷出該類(lèi)中的所有g(shù)etter方法,得到getHollis和isSuccess,然后根據(jù)JavaBeans規(guī)則,他會(huì)認(rèn)為這是兩個(gè)屬性yudao和success的值。直接序列化成json:

{“yudao”:”yudaoyuanma”,”success”:true}

但是Gson并不是這么做的,他是通過(guò)反射遍歷該類(lèi)中的所有屬性,并把其值序列化成json:

{“isSuccess”:true}

可以看到,由于不同的序列化工具,在進(jìn)行序列化的時(shí)候使用到的策略是不一樣的 ,所以,對(duì)于同一個(gè)類(lèi)的同一個(gè)對(duì)象的序列化結(jié)果可能是不同的。那么,如果我們把一個(gè)對(duì)象使用fastjson進(jìn)行序列化,再使用Gson反序列化會(huì)發(fā)生什么呢?

publicclassBooleanMainTest{

publicstaticvoidmain(String[]args)throwsIOException{

Modelmodel=newModel();

model.setSuccess(true);

Gsongson=newGson();

System.out.println(gson.fromJson(JSON.toJSONString(model),Model.class));

}

}

以上代碼,輸出結(jié)果:

Model[isSuccess=false]

這和我們預(yù)期的結(jié)果完全相反,原因是因?yàn)镴SON框架通過(guò)掃描所有的getter后發(fā)現(xiàn)有一個(gè)isSuccess方法,然后根據(jù)JavaBeans的規(guī)范,解析出變量名為success,把model對(duì)象序列化城字符串后內(nèi)容為{"success":true}。

根據(jù){"success":true}這個(gè)json串,Gson框架在通過(guò)解析后,通過(guò)反射尋找Model類(lèi)中的success屬性,但是Model類(lèi)中只有isSuccess屬性,所以,最終反序列化后的Model類(lèi)的對(duì)象中,isSuccess則會(huì)使用默認(rèn)值false。

但是,一旦以上代碼發(fā)生在生產(chǎn)環(huán)境,這絕對(duì)是一個(gè)致命的問(wèn)題。

所以,作為開(kāi)發(fā)者,我們應(yīng)該想辦法盡量避免這種問(wèn)題的發(fā)生。

所以,建議大家使用success而不是 isSuccess 這種形式。 這樣,該類(lèi)里面的成員變量時(shí)success,getter方法是isSuccess,這是完全符合JavaBeans規(guī)范的。無(wú)論哪種序列化框架,執(zhí)行結(jié)果都一樣。就從源頭避免了這個(gè)問(wèn)題。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8381

    瀏覽量

    150588
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1737

    瀏覽量

    31994
  • RPC
    RPC
    +關(guān)注

    關(guān)注

    0

    文章

    110

    瀏覽量

    11487

原文標(biāo)題:新來(lái)個(gè)技術(shù)總監(jiān):誰(shuí)在用isXxx形式定義布爾類(lèi)型年后不用來(lái)了

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙原生應(yīng)用元服務(wù)開(kāi)發(fā)-倉(cāng)頡基礎(chǔ)數(shù)據(jù)類(lèi)型布爾類(lèi)型

    布爾類(lèi)型使用Bool 表示,用來(lái)表示邏輯中的真和假。 布爾類(lèi)型字面量 布爾
    發(fā)表于 09-09 09:57

    技術(shù)總監(jiān)(硬件系統(tǒng))-北京

    技術(shù)總監(jiān)(硬件系統(tǒng))-北京任職要求:1.通信、電子計(jì)算機(jī)相關(guān)專(zhuān)業(yè)碩士以上學(xué)歷;2.年齡30-40之間,有在集成電路設(shè)計(jì)公司或其他電子公司做過(guò)技術(shù)總監(jiān);3.可以偏硬件系統(tǒng)設(shè)計(jì),主要是基于
    發(fā)表于 03-27 10:47

    誰(shuí)在大的公司搞技術(shù)求推薦

    誰(shuí)在大的公司搞技術(shù)求推薦?只求學(xué)習(xí)技術(shù),工資可以不要給推薦人
    發(fā)表于 04-06 15:53

    w7500P,誰(shuí)在用啊,串口轉(zhuǎn)以太的需要什么程序,要怎么燒進(jìn)去????

    ,,望大神指路,,w7500P,誰(shuí)在用啊,串口轉(zhuǎn)以太的需要什么程序,要怎么燒進(jìn)去????
    發(fā)表于 07-17 21:42

    模擬IC設(shè)計(jì)總監(jiān)/技術(shù)總監(jiān)-廣東

    技術(shù)總監(jiān)/模擬IC設(shè)計(jì)總監(jiān)-廣州 珠海崗位職責(zé):1、負(fù)責(zé)制定技術(shù)路線和產(chǎn)品路線;2、指導(dǎo)研發(fā)團(tuán)隊(duì)新產(chǎn)品定義、立項(xiàng)、設(shè)計(jì)、驗(yàn)證;3、指導(dǎo)研發(fā)團(tuán)
    發(fā)表于 09-01 16:38

    如何在前面板把布爾設(shè)置為透明,不用定義控件改變布爾的外形

    `如圖,四個(gè)布爾控件不是自定義控件,怎么只憑圖片改變外形?“會(huì)計(jì)小貼士-real” “說(shuō)明”怎么設(shè)置透明 請(qǐng)各位幫忙@amywu1981 @ShuiMoLise @wuyaning222331
    發(fā)表于 08-31 12:04

    高壓線性有什么型號(hào)比較好的,都有誰(shuí)在用???推薦一下

    高壓線性有什么型號(hào)比較好的,都有誰(shuí)在用?。客扑]一下
    發(fā)表于 01-16 11:08

    還有誰(shuí)在用MCIMX6Q5EY10AD

    我們項(xiàng)目升級(jí)成IMX8,有5包 MCIMX6Q5EY10AD 想轉(zhuǎn)讓?zhuān)?qǐng)問(wèn)有誰(shuí)在用啊,謝謝!張工 壹叁柒 2421 2401
    發(fā)表于 02-16 20:05

    布爾代數(shù),布爾代數(shù)是什么意思

    布爾代數(shù),布爾代數(shù)是什么意思 布爾代數(shù)最初是作為對(duì)邏輯思維法則的研究出現(xiàn)的。英國(guó)哲學(xué)家George Boole于1847年的論文“邏輯之?dāng)?shù)學(xué)分析”及“思維法則之研究”中引
    發(fā)表于 03-08 11:04 ?8316次閱讀

    硬件類(lèi)型定義

    “hw_types.h” 里,定義布爾類(lèi)型 tBoolean,以及與其相關(guān)的常量 true 和 false,以方便操作。
    發(fā)表于 01-13 16:32 ?7次下載

    布爾代數(shù)定律的描述

    布爾代數(shù)是我們用來(lái)分析數(shù)字門(mén)和電路的數(shù)學(xué)。我們可以使用這些“布爾定律”來(lái)減少和簡(jiǎn)化復(fù)雜的布爾表達(dá)式,以減少所需的邏輯門(mén)數(shù)。因此,布爾代數(shù)是一
    的頭像 發(fā)表于 06-22 09:36 ?7146次閱讀
    <b class='flag-5'>布爾</b>代數(shù)定律的描述

    c++ 之布爾類(lèi)型和引用的學(xué)習(xí)總結(jié)

    在c語(yǔ)言里面我們知道是沒(méi)有布爾數(shù)據(jù)類(lèi)型的,而在C++中添加了布爾數(shù)據(jù)類(lèi)型(bool),它的取值是:true或者false(也就是1或者0),在內(nèi)存大小上它占用一個(gè)字節(jié)大小。
    的頭像 發(fā)表于 12-24 18:03 ?552次閱讀

    基于布爾函數(shù)導(dǎo)數(shù)的布爾置換構(gòu)造

    布爾函數(shù)導(dǎo)數(shù)的性質(zhì)在密碼構(gòu)造中起著重要的作用。文中利用布爾函數(shù)導(dǎo)數(shù)的性質(zhì),構(gòu)造了一個(gè)新的平衡布爾函數(shù)然后基于平衡布爾函數(shù)與布爾置換的關(guān)系,構(gòu)
    發(fā)表于 06-17 10:58 ?15次下載

    python布爾值是什么

    python布爾值 1. 什么是布爾值 但在Python語(yǔ)言中,布爾類(lèi)型只有兩個(gè)值 True :表示真值 False :表示假值 請(qǐng)注意,首字母要大寫(xiě),不能是其它花式變型。 所有的計(jì)算
    的頭像 發(fā)表于 02-21 16:10 ?6796次閱讀

    定義數(shù)據(jù)類(lèi)型

    在運(yùn)算之前我們必須首先定義出數(shù)據(jù)類(lèi)型,定義出腳本支持的數(shù)據(jù)類(lèi)型,這是運(yùn)算的基礎(chǔ)。 這一小節(jié)我們將定義出數(shù)據(jù)
    的頭像 發(fā)表于 03-03 10:10 ?878次閱讀