在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

新來個技術總監:誰在用isXxx形式定義布爾類型年后不用來了

jf_ro2CN3Fa ? 來源:Hollis ? 2023-06-11 16:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群


在日常開發中,我們會經常要在類中定義布爾類型的變量,比如在給外部系統提供一個RPC接口的時候,我們一般會定義一個字段表示本次請求是否成功的。

關于這個”本次請求是否成功”的字段的定義,我見過很多不同的開發者,定義的方式都不同,尤其是在屬性的命名上,有人用 success,有人用 isSuccess 表示。

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

根據JavaBeans Specification規定,如果是普通的參數propertyName,要以以下方式定義其setter/getter:

publicget();

publicvoidset(a);

但是,布爾類型的變量propertyName則是單獨定義的:

publicbooleanis();

publicvoidset(booleanm);

success方法的 getter 應該是isSuccess/getSuccess,而isSuccess的getter 應該是isIsSuccess/getIsSuccess。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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

但是很多人,在使用isSuccess作為屬性名的時候,還是會采用isSuccess/getSuccess作為 getter 方法名,尤其是現在的很多 IDE 在默認生成 getter 的時候也是會生成isSuccess。

在一般情況下,其實是沒有影響的。但是有一種特殊情況就會有問題,那就是發生序列化的時候可能會導致參數轉換異常。

我們先來定義一個 JavaBean:

classModelimplementsSerializable{


privatestaticfinallongserialVersionUID=1836697963736227954L;

privatebooleanisSuccess;

publicbooleanisSuccess(){

returnisSuccess;

}

publicvoidsetSuccess(booleansuccess){

isSuccess=success;

}

publicStringgetHollis(){

return"yudaoyuanma";

}

}

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

我們分別使用不同的 JSON 序列化工具來對這個類的對象進行序列化和反序列化:

publicclassBooleanMainTest{

publicstaticvoidmain(String[]args)throwsIOException{

//定一個Model類型

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));

}

}

以上代碼輸出結果:

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

SerializableResultWithGson:{"isSuccess":true}

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

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

我們可以得出結論:fastjson和jackson在把對象序列化成json字符串的時候,是通過反射遍歷出該類中的所有getter方法,得到getHollis和isSuccess,然后根據JavaBeans規則,他會認為這是兩個屬性yudao和success的值。直接序列化成json:

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

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

{“isSuccess”:true}

可以看到,由于不同的序列化工具,在進行序列化的時候使用到的策略是不一樣的 ,所以,對于同一個類的同一個對象的序列化結果可能是不同的。那么,如果我們把一個對象使用fastjson進行序列化,再使用Gson反序列化會發生什么呢?

publicclassBooleanMainTest{

publicstaticvoidmain(String[]args)throwsIOException{

Modelmodel=newModel();

model.setSuccess(true);

Gsongson=newGson();

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

}

}

以上代碼,輸出結果:

Model[isSuccess=false]

這和我們預期的結果完全相反,原因是因為JSON框架通過掃描所有的getter后發現有一個isSuccess方法,然后根據JavaBeans的規范,解析出變量名為success,把model對象序列化城字符串后內容為{"success":true}。

根據{"success":true}這個json串,Gson框架在通過解析后,通過反射尋找Model類中的success屬性,但是Model類中只有isSuccess屬性,所以,最終反序列化后的Model類的對象中,isSuccess則會使用默認值false。

但是,一旦以上代碼發生在生產環境,這絕對是一個致命的問題。

所以,作為開發者,我們應該想辦法盡量避免這種問題的發生。

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

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


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 接口
    +關注

    關注

    33

    文章

    8992

    瀏覽量

    153671
  • 參數
    +關注

    關注

    11

    文章

    1867

    瀏覽量

    33053
  • RPC
    RPC
    +關注

    關注

    0

    文章

    111

    瀏覽量

    11876

原文標題:新來個技術總監:誰在用isXxx形式定義布爾類型年后不用來了

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    鴻蒙原生應用元服務開發-倉頡基礎數據類型布爾類型

    布爾類型使用Bool 表示,用來表示邏輯中的真和假。 布爾類型字面量 布爾
    發表于 09-09 09:57

    技術總監(硬件系統)-北京

    技術總監(硬件系統)-北京任職要求:1.通信、電子計算機相關專業碩士以上學歷;2.年齡30-40之間,有在集成電路設計公司或其他電子公司做過技術總監;3.可以偏硬件系統設計,主要是基于
    發表于 03-27 10:47

    誰在大的公司搞技術求推薦

    誰在大的公司搞技術求推薦?只求學習技術,工資可以不要給推薦人
    發表于 04-06 15:53

    w7500P,誰在用啊,串口轉以太的需要什么程序,要怎么燒進去啊??

    ,,望大神指路,,w7500P,誰在用啊,串口轉以太的需要什么程序,要怎么燒進去啊??
    發表于 07-17 21:42

    模擬IC設計總監/技術總監-廣東

    技術總監/模擬IC設計總監-廣州 珠海崗位職責:1、負責制定技術路線和產品路線;2、指導研發團隊新產品定義、立項、設計、驗證;3、指導研發團
    發表于 09-01 16:38

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

    `如圖,四個布爾控件不是自定義控件,怎么只憑圖片改變外形?“會計小貼士-real” “說明”怎么設置透明 請各位幫忙@amywu1981 @ShuiMoLise @wuyaning222331
    發表于 08-31 12:04

    高壓線性有什么型號比較好的,都有誰在用啊?推薦一下

    高壓線性有什么型號比較好的,都有誰在用啊?推薦一下
    發表于 01-16 11:08

    還有誰在用MCIMX6Q5EY10AD

    我們項目升級成IMX8,有5包 MCIMX6Q5EY10AD 想轉讓,請問有誰在用啊,謝謝!張工 壹叁柒 2421 2401
    發表于 02-16 20:05

    布爾代數,布爾代數是什么意思

    布爾代數,布爾代數是什么意思 布爾代數最初是作為對邏輯思維法則的研究出現的。英國哲學家George Boole于1847年的論文“邏輯之數學分析”及“思維法則之研究”中引
    發表于 03-08 11:04 ?8639次閱讀

    硬件類型定義

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

    布爾代數定律的描述

    布爾代數是我們用來分析數字門和電路的數學。我們可以使用這些“布爾定律”來減少和簡化復雜的布爾表達式,以減少所需的邏輯門數。因此,布爾代數是一
    的頭像 發表于 06-22 09:36 ?8012次閱讀
    <b class='flag-5'>布爾</b>代數定律的描述

    c++ 之布爾類型和引用的學習總結

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

    基于布爾函數導數的布爾置換構造

    布爾函數導數的性質在密碼構造中起著重要的作用。文中利用布爾函數導數的性質,構造了一個新的平衡布爾函數然后基于平衡布爾函數與布爾置換的關系,構
    發表于 06-17 10:58 ?15次下載

    python布爾值是什么

    python布爾值 1. 什么是布爾值 但在Python語言中,布爾類型只有兩個值 True :表示真值 False :表示假值 請注意,首字母要大寫,不能是其它花式變型。 所有的計算
    的頭像 發表于 02-21 16:10 ?7296次閱讀

    定義數據類型

    在運算之前我們必須首先定義出數據類型,定義出腳本支持的數據類型,這是運算的基礎。 這一小節我們將定義出數據
    的頭像 發表于 03-03 10:10 ?1309次閱讀
    主站蜘蛛池模板: 日韩午夜大片 | 在线视频综合网 | 69xxxx日本hd4k| 一区二区中文字幕亚洲精品 | 精品日韩 | 女主播扒开内衣让粉丝看个够 | 美女网站视频一区 | 狠狠激情五月综合婷婷俺 | 日本免费在线视频 | 欧美人成绝费网站色www吃脚 | 色婷婷色综合缴情在线 | 成人午夜影院在线观看 | 欧美另类高清xxxxx | 亚洲国产精品自在现线让你爽 | 精品久久久久久午夜 | 我爱操| 美女喷白浆视频 | 国产看午夜精品理论片 | 爽好舒服快受不了了老师 | 欧美午夜视频一区二区三区 | 午夜免费视频观看在线播放 | 禁h粗大太大好爽好涨受不了了 | www.午夜视频| 一级做a爱免费观看视频 | 寂寞午夜影院 | 亚洲三级毛片 | 男人和女人做a免费视频 | 欧美婷婷综合 | 加勒比一木道|视频在线看 加勒比在线免费视频 | 亚洲国产丝袜精品一区杨幂 | 亚洲综合色网站 | 簧片地址| 狼狼狼色精品视频在线播放 | 天天操天天谢 | 国产一区二区三区乱码 | 欧美日本色 | 女女综合网 | 2017天天天天做夜夜夜做 | 韩国男女无遮挡高清性视频 | 天堂资源在线官网资源 | 性视频一区 |