范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

新来个技术总监谁在用isXxx形式定义布尔类型年后不用来了

  在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。
  关于这个"本次请求是否成功"的字段的定义,我见过很多不同的开发者,定义的方式都不同,尤其是在属性的命名上,有人用 success,有人用 isSuccess 表示。
  从语义上面来讲,两种命名方式都可以讲的通,并且也都没有歧义。那么还有什么原则可以参考来让我们做选择呢。
  根据JavaBeans Specification规定,如果是普通的参数propertyName,要以以下方式定义其setter/getter: public  get();  public void set( a);
  但是,布尔类型的变量propertyName则是单独定义的: public boolean is();  public void set(boolean m);
  success方法的 getter 应该是isSuccess/getSuccess,而isSuccess的getter 应该是isIsSuccess/getIsSuccess。
  但是很多人,在使用isSuccess作为属性名的时候,还是会采用isSuccess/getSuccess作为 getter 方法名,尤其是现在的很多 IDE 在默认生成 getter 的时候也是会生成isSuccess。
  在一般情况下,其实是没有影响的。但是有一种特殊情况就会有问题,那就是发生序列化的时候可能会导致参数转换异常。
  我们先来定义一个 JavaBean: class Model implements Serializable {      private static final long serialVersionUID = 1836697963736227954L;     private boolean isSuccess;     public boolean isSuccess() {         return isSuccess;     }     public void setSuccess(boolean success) {         isSuccess = success;     }     public String getHollis(){         return "hollischuang";     }  }
  在这个 JavaBean 中,有一个成员变量isSuccess,三个方法,分别是IDE帮我们自动生成的isSuccess和setSuccess,另外一个是作者自己增加的一个符合getter命名规范的方法。
  我们分别使用不同的 JSON 序列化工具来对这个类的对象进行序列化和反序列化: public class BooleanMainTest {       public static void main(String[] args) throws IOException {           //定一个Model类型           Model model = new Model();           model.setSuccess(true);             //使用fastjson(1.2.16)序列化model成字符串并输出           System.out.println("Serializable Result With fastjson :" + JSON.toJSONString(model));             //使用Gson(2.8.5)序列化model成字符串并输出           Gson gson =new Gson();           System.out.println("Serializable Result With Gson :" +gson.toJson(model));             //使用jackson(2.9.7)序列化model成字符串并输出           ObjectMapper om = new ObjectMapper();           System.out.println("Serializable Result With jackson :" +om.writeValueAsString(model));       }  }
  以上代码输出结果: Serializable Result With fastjson :{"hollis":"hollischuang","success":true}  Serializable Result With Gson :{"isSuccess":true}  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: {"hollis":"hollischuang","success":true}
  但是Gson并不是这么做的,他是通过反射遍历该类中的所有属性,并把其值序列化成json: {"isSuccess":true}
  可以看到,由于不同的序列化工具,在进行序列化的时候使用到的策略是不一样的,所以,对于同一个类的同一个对象的序列化结果可能是不同的。那么,如果我们把一个对象使用fastjson进行序列化,再使用Gson反序列化会发生什么呢?  public class BooleanMainTest {       public static void main(String[] args) throws IOException {           Model model = new Model();           model.setSuccess(true);           Gson gson =new Gson();           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规范的。无论哪种序列化框架,执行结果都一样。就从源头避免了这个问题。
  关于作者 :Hollis(ID:hollischuang),一个对Coding有着独特追求的人,现任阿里巴巴技术专家,个人技术博主,技术文章全网阅读量数千万,《程序员的三门课》联合作者。

南方人遭骁龙888制裁,北方网友完全不虚,票选出这几款旗舰手机要说今年旗舰手机共同的痛,那就是莫过于高通的骁龙888处理器不争气了,由于其功耗过大导致手机发热降频且影响续航,很多手机厂商不得不采取主动降频的方式来保证用户的日常需求。最近南方几三款千元学生机,性价比超高,性能媲美旗舰机学生党选机最看重的是其性价比,以及手机玩游戏的时候是否流畅。而接下来介绍的就是三款最具有性价比的千元机,运行流畅不发热,性能可以媲美旗舰机,十分适合我们的学生党购买。第一款Redm5000mAh大电池,8256G降800,7nm旗舰开始清仓在国内手机市场上,手机存储方面做得越来越好了,像最开始出现智能手机的时候,我记得当时智能手机还可插内存卡。随后就发展到现在的大内存手机,而手机使用一段时间后,社交软件以及游戏内存的轻薄本处理器怎么选?5800U1165G7还是1135G7?移动办公需求增长等原因下,轻薄本成为更多人的购买选择。CPU作为笔记本的核心大脑,选择一款适合自己的处理器是十分重要的。2021年轻薄本处理器市场精彩纷呈,英特尔和AMD都推出了几配备天玑120060w主打全能轻旗舰OPPOK9Pro已上架待发布众所周知,在9月16日的OPPO新品发布会上,官方正式发布了FindX3Pro摄影师版和ColorOS12等新品,但是此前网间曝光的有望在此次发布会上发布的OPPOK9Pro并没有阿里巴巴分兵做社区电商,盒马面对B系很委屈,失位后只要回名头2021年9月,阿里巴巴的社区团购业务发生来更名盒马集市改名淘菜菜。这其实也反应了阿里内部竞争更激烈,嫡系旁系在博弈。阿里巴巴分兵做社区电商,旁系的盒马起步更早,嫡系的B系起步较晚苹果2022年计划发布全新的AirPodsProMax的查找网络支持彭博社(Bloomberg)的MarkGurman在最新一期的PowerOn时事通讯中分享了他对未来苹果产品的期望。他仍然预计新的MacBookPro和AirPods将在2021年vivoX70Pro解析不止影像升级,更是推料王者一款高端旗舰机应该具备哪些配置?是出色性能,还是专业影像体验?对于这个问题,大部分厂商都有着各自一套应对策略,但是对于vivo来说答案只有一个全都要!对此,我们从最新的发布的vivrealme实力打磨天花板产品,真我GTNeo2能否成为爆款机型realme作为追求极致性价比的手机品牌,每一款新机型的发布,都对友商造成不小的压力。而最新关于realme手机的新品消息,是在本月22号发布新机真我GTNeo2,realme官方比较实用的选股指标有哪些?这个因人而异,在我看来,比较实用的是MACD和BBI,MACD用来判断大波段的买卖点,BBI用来判断趋势过程中的强支撑和强阻力。MACD的波段买卖点我已经发布视频教学,大家可以去看华为进军挖矿业!鸿蒙正在工业领域攻城略地煤炭在我国能源中的地位不言而喻,然而由于矿业的特殊,开采难度大危险度高,一直是整个煤炭行业面临的难题。如何解决这一难题成为了煤炭从业者要考虑的问题。而近年来人工智能的发展,让煤炭行
让女人超感动的100句温柔浪漫语中67。只想牵妳的手。。看妳的眼光着脚丫子。。在海边漫步只有妳。。只因妳。。68。我这一生只为了吻你。。69。现在每天醒来睁开眼见到的是墙上妳那似阳光般的笑靥,好想哪天醒来时,第一眼不能进电梯楼房,不能飞线,电动车该去哪充电呢?电动车在国内的发展不过20余年,但是在市场规模和受众群体上却轻松超过了发展百年的汽车,在众多数据中可以看出电动车已经成为了不可或缺的出行工具。在城市中开车出行,难免会出现堵车问题,速腾遇到对手,搭载地球梦1。5T发动机,加92粗粮续航长近期汽车市场出现了芯片短缺的现象,很多汽车基本生产工序已经完成,就只等芯片的到位了,以至于很多汽车厂商推迟了新车型的上市,但是对于某个品牌的忠实粉丝来说,并不是因为等待而放弃。虽迟轿车报废标准升级,这方面不合格,将强制下线说到汽车的报废标准,很多车主庆幸做出了调整,毕竟在调整之前,家用轿车的报废年限只有15年,也就是说不管汽车的状态如何,行驶的历程有多少,达到15年的使用年限时就必须报废。这一措施的电动车充电慢?无限续航带来新体验,出行更高效随着人们出行要求越来越高,出行工具也变得更加多样化,人们可以根据出行目的来选择多种工具。若是选择远距离出行,就可以驾驶汽车近距离出行首选电动车自行车就算是在外地出行也可以使用共享自三轮四轮电动车或将解禁,多地开放挂牌,明确低速电动车的路权低速电动车该何去何从?我们在看到低速电动车弊端的同时,也应该了解到优点,毕竟有需求才会有市场,低速电动车之所以拥有如此大的保有量,也是符合了一部分人的出行需求。相信在看到两轮电动车平时用不上,下车易绊倒,电动车脚蹬只是摆设?这里作出解答电动车发展进入新时代,随着新国标的实施,相关部门对于电动车展开了最严格的管制,在制定新标准的同时,也对电动车制定了一系列交规,由此可以看出对电动车管制的决心。在此之前,电动车的发展电动车新规实施,整治以下行为,违规将面临扣车罚款很多车主不理解何为电动车新国标,综合来说,对于生产厂家的生产制定规范对电动车车主的行为作出限制,都是出自新国标,电动车新国标涵盖范围比较广,也是目前为止对电动车实施的一大重要管制。反监控信号探测器,新一代哄女孩神器,和女朋友来一场反窥大战!说到监控定位隐匿的微型摄像头反监控,相信大家第一时间就会想起各种电影大片。由于科技的进步,各种高科技产品获取越来越容易,让一些不谋好心的人所利用。所以,我们平时也应该懂得做一些保护别再等5G杀手级应用了,5G的志向本不在此!5G,正在快速向我们走来。曾经,它的模样是模糊不清的。5G作为最新一代的移动通信技术,将怎样改变我们的生活?对此人们充满了期待和畅想。在每次通信相关的展会上,5G业务演示都是当仁不被迪士尼选中的女孩赛琳娜戈麦斯的15岁到29岁明信片Vol。72004年,因参加迪士尼全球才艺计划而被华特迪士尼公司相中并签约。赛琳娜戈麦斯可能有一张娃娃脸,但不要搞错,女孩知道如何改变自己的风格。这位曾经的迪斯尼明星成为了热