成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

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

  1. public <PropertyType> get<PropertyName>(); 
  2.  
  3. public void set<PropertyName>(<PropertyType> a); 

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

  1. public boolean is<PropertyName>(); 
  2.  
  3. public void set<PropertyName>(boolean m); 

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

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

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

我們先來定義一個 JavaBean:

  1. class Model implements Serializable { 
  2.  
  3.  
  4.    private static final long serialVersionUID = 1836697963736227954L; 
  5.  
  6.    private boolean isSuccess; 
  7.  
  8.    public boolean isSuccess() { 
  9.  
  10.        return isSuccess; 
  11.  
  12.    } 
  13.  
  14.    public void setSuccess(boolean success) { 
  15.  
  16.        isSuccess = success; 
  17.  
  18.    } 
  19.  
  20.    public String getHollis(){ 
  21.  
  22.        return "hollischuang"
  23.  
  24.    } 
  25.  

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

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

  1. public class BooleanMainTest { 
  2.  
  3.      public static void main(String[] args) throws IOException { 
  4.  
  5.          //定一個Model類型 
  6.  
  7.          Model model = new Model(); 
  8.  
  9.          model.setSuccess(true); 
  10.  
  11.  
  12.  
  13.          //使用fastjson(1.2.16)序列化model成字符串并輸出 
  14.  
  15.          System.out.println("Serializable Result With fastjson :" + JSON.toJSONString(model)); 
  16.  
  17.  
  18.  
  19.          //使用Gson(2.8.5)序列化model成字符串并輸出 
  20.  
  21.          Gson gson =new Gson(); 
  22.  
  23.          System.out.println("Serializable Result With Gson :" +gson.toJson(model)); 
  24.  
  25.  
  26.  
  27.          //使用jackson(2.9.7)序列化model成字符串并輸出 
  28.  
  29.          ObjectMapper om = new ObjectMapper(); 
  30.  
  31.          System.out.println("Serializable Result With jackson :" +om.writeValueAsString(model)); 
  32.  
  33.      } 
  34.  

以上代碼輸出結果:

  1. Serializable Result With fastjson :{"hollis":"hollischuang","success":true
  2.  
  3. Serializable Result With Gson :{"isSuccess":true
  4.  
  5. Serializable Result With jackson :{"success":true,"hollis":"hollischuang"

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

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

  1. {“hollis”:”hollischuang”,”success”:true

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

  1. {“isSuccess”:true

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

  1. public class BooleanMainTest { 
  2.  
  3.     public static void main(String[] args) throws IOException { 
  4.  
  5.         Model model = new Model(); 
  6.  
  7.         model.setSuccess(true); 
  8.  
  9.         Gson gson =new Gson(); 
  10.  
  11.         System.out.println(gson.fromJson(JSON.toJSONString(model),Model.class)); 
  12.  
  13.     } 
  14.  

以上代碼,輸出結果:

  1. 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規范的。無論哪種序列化框架,執行結果都一樣。就從源頭避免了這個問題。

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2020-02-13 08:08:23

禁止使用Lombok

2020-02-12 14:03:25

實用Java工具

2023-07-26 00:46:25

GitMain主分支

2022-07-04 09:43:46

RabbitMQ消息消息隊列

2023-01-04 17:19:21

MQ消息中間件

2025-04-27 08:00:00

分布式 ID分布式系統ID

2016-12-06 09:01:14

2023-09-11 17:55:44

Python測試運算符

2014-08-28 17:49:43

阿里云云計算

2014-10-11 13:49:59

阿里云

2015-06-15 09:58:42

Mac中國

2009-05-05 08:26:33

GoogleAndroid移動OS

2009-05-05 10:32:36

LinuxAndroid技術基石

2009-05-19 10:48:12

AndroidGoogle移動OS

2020-05-13 10:39:08

kill -9線上Java進程

2021-02-04 09:09:09

iOS 14.5 Be蘋果解鎖

2013-09-25 11:12:47

2009-04-05 10:26:47

2020-02-25 17:03:29

技術研發指標

2012-08-08 15:21:56

Office 2013
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美九九 | 91精品久久久久久久久久 | 国产欧美精品 | 国产三区视频在线观看 | 日韩午夜一区二区三区 | 久久精品欧美一区二区三区麻豆 | 亚洲精品国产偷自在线观看 | 性高湖久久久久久久久 | 婷婷色在线播放 | 天天干天天操 | 日韩亚洲一区二区 | 精品一区二区久久久久久久网站 | 国产精品久久久久久久午夜片 | 懂色av色香蕉一区二区蜜桃 | 黄色一级大片在线免费看产 | 99在线免费观看视频 | 成人一区二区三区 | 一区二区三区国产视频 | 成人在线免费观看视频 | 欧美日韩一二三区 | 岛国午夜 | 欧美精品在线看 | 亚洲精品久 | 中文字幕第90页 | 国产一级片精品 | 精品视频国产 | 国产区精品视频 | 亚洲综合一区二区三区 | 91日韩| 亚洲一区在线观看视频 | 美女黄视频网站 | 国产精品久久久久免费 | 国产精品日日做人人爱 | 日韩欧美国产成人一区二区 | 成人在线观看免费 | av在线免费观看网站 | 一级a性色生活片久久毛片 午夜精品在线观看 | 亚洲天堂网站 | 亚洲第一成人影院 | 天天操精品视频 | 日本免费一区二区三区四区 |