游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

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

  在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个RPC接口的时候,我们一般会定义一个字段表示本次请求是否成功的。
  关于这个本次请求是否成功的字段的定义,我见过很多不同的开发者,定义的方式都不同,尤其是在属性的命名上,有人用success,有人用isSuccess表示。
  从语义上面来讲,两种命名方式都可以讲的通,并且也都没有歧义。那么还有什么原则可以参考来让我们做选择呢。
  根据JavaBeansSpecification规定,如果是普通的参数propertyName,要以以下方式定义其settergetter:publicPropertyTypegetPropertyName();publicvoidsetPropertyName(PropertyTypea);
  但是,布尔类型的变量propertyName则是单独定义的:publicbooleanisPropertyName();publicvoidsetPropertyName(booleanm);
  success方法的getter应该是isSuccessgetSuccess,而isSuccess的getter应该是isIsSuccessgetIsSuccess。
  但是很多人,在使用isSuccess作为属性名的时候,还是会采用isSuccessgetSuccess作为getter方法名,尤其是现在的很多IDE在默认生成getter的时候也是会生成isSuccess。
  在一般情况下,其实是没有影响的。但是有一种特殊情况就会有问题,那就是发生序列化的时候可能会导致参数转换异常。
  我们先来定义一个JavaBean:classModelimplementsSerializable{privatestaticfinallongserialVersionUID1836697963736227954L;privatebooleanisSuccess;publicbooleanisSuccess(){returnisSuccess;}publicvoidsetSuccess(booleansuccess){isSuccesssuccess;}publicStringgetHollis(){returnhollischuang;}}
  在这个JavaBean中,有一个成员变量isSuccess,三个方法,分别是IDE帮我们自动生成的isSuccess和setSuccess,另外一个是作者自己增加的一个符合getter命名规范的方法。
  我们分别使用不同的JSON序列化工具来对这个类的对象进行序列化和反序列化:publicclassBooleanMainTest{publicstaticvoidmain(String〔〕args)throwsIOException{定一个Model类型ModelmodelnewModel();model。setSuccess(true);使用fastjson(1。2。16)序列化model成字符串并输出System。out。println(SerializableResultWithfastjson:JSON。toJSONString(model));使用Gson(2。8。5)序列化model成字符串并输出GsongsonnewGson();System。out。println(SerializableResultWithGson:gson。toJson(model));使用jackson(2。9。7)序列化model成字符串并输出ObjectMapperomnewObjectMapper();System。out。println(SerializableResultWithjackson:om。writeValueAsString(model));}}
  以上代码输出结果:SerializableResultWithfastjson:{hollis:hollischuang,success:true}SerializableResultWithGson:{isSuccess:true}SerializableResultWithjackson:{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反序列化会发生什么呢?publicclassBooleanMainTest{publicstaticvoidmain(String〔〕args)throwsIOException{ModelmodelnewModel();model。setSuccess(true);GsongsonnewGson();System。out。println(gson。fromJson(JSON。toJSONString(model),Model。class));}}
  以上代码,输出结果:Model〔isSuccessfalse〕
  这和我们预期的结果完全相反,原因是因为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有着独特追求的人,现任阿里巴巴技术专家,个人技术博主,技术文章全网阅读量数千万,《程序员的三门课》联合作者。

光速每秒30万公里,太阳离地球约1。5亿公里,那为什么我们一太阳光到达地球需要8分钟的时间,所以我们看到的并不是实时的太阳图像,而是8分钟前的。如果有一个巨大的天幕遮住太阳,则8分钟之后我们才会意识到太阳消失了,地球变黑暗了!而如……2021拍摄表现最好的三款手机,款款只为随手拍而生,精彩不容前言目前的手机厂商在激烈的角逐下,纷纷把发展手机技能的苗头对准摄像上,从双摄到四摄,从超大底到超广角,从光学变焦到光学防抖,从数码摄影到计算摄影,手机的影像技术早已成为判……三十而已演员表及人物关系图介绍电视剧《三十而已》可谓是一部非常大火的剧,剧中不仅仅剧情深受大家的喜欢,而且剧中的演员的演技也是备受大家的称赞,电视剧《三十而已》演员表以及人物关系图介绍,一起来看一下具体的情……华尔街老将警告这是我职业生涯里见过的最大泡沫RichardBernsteinAdvisors的首席执行官伯恩斯坦(RichBernstein)近日表示,市场正处于一个巨大的泡沫时期,但除非流动性迅速枯竭,否则出现大规模熊……三十而已样片泄露出品方报警三十而已大结局是什么近日,电视剧《三十而已》可谓是一部特别火的剧,这部剧大结局目前是超前点播的状态,但是在短视频平台上面竟然有样片已经泄露,目前出品方柠萌影业已经报警,正在进一步的调查当中。1三十……三十而已原生家庭让人感触论原生家庭的重要性近日,电视剧《三十而已》的播出,让不少人都深有感触,在感慨渣男出轨的同时,也看到了三位女主背后原生家庭的重要性,她们之所以能够直面自己的三十岁,还曾在三十岁乘风破浪,是完整的原……许幻山时间管理大师什么梗三十而已许幻山结局遭起底近段时间以来,电视剧《三十而已》可谓是火爆了,几乎哪里都能看到关于这部剧的相关话题。近日,许幻山时间管理大师的话题登上了热搜榜,这是什么梗呢?在电视剧《三十而已》许幻山的结局遭……三十而已钟晓芹是谁演的钟晓芹最后和谁在一起了近日,随着电视剧《三十而已》的热播,剧中的很多角色也颇受大家的关注,其中钟晓芹这个角色很多人都很喜欢,钟晓芹这个角色是谁演的呢?钟晓芹最后和谁在一起了?一起来看一下具体的情况。……新零售四步曲新消费环境随着移动应用的发展,手机俨然成为人体新的器官,很多人早晨醒来第一件事就是摸手机;在地铁里或公共汽车上,不论男女老少,大部分人都在低头看手机;甚至在聚会的餐桌旁,……三十而已陈屿是谁演的剧中结局和钟晓芹离婚了吗近日,电视剧《三十而已》正在热播当中,剧中陈屿这个角色着实是让很多人都纷纷吐槽是渣男,做事情实在是太气人了。那么,剧中陈屿是谁演的呢?剧中结局和钟晓芹离婚了吗?一起来看一下。1……三十而已陈旭是谁演的被大家忽略的陈旭原来才是最有情商的一个近段时间以来,电视剧《三十而已》正在热播当中,在大家都在为顾佳打抱不平的时候,很多人都忽略了陈旭这个人物,《三十而已》当中陈旭是谁演的呢?被大家忽略的陈旭原来才是最有情商的一个……西南交通大学电气工程学院获批国家重点研发计划交通基础设施重点近日,科技部高技术研究发展中心公示了国家重点研发计划交通基础设施重点专项2021年度拟立项项目,西南交通大学电气工程学院高仕斌教授主持的《轨道交通网源储车协同供能技术》项目获批……
蜘蛛侠平行宇宙火热预售中12月21日潮爆视听贺岁首选由美国哥伦比亚影片公司、美国漫威公司和美国索尼动画影片公司联合出品的超级英雄动画电影《蜘蛛侠:平行宇宙》将在12月21日登陆中国内地大银幕。这部被众多影评人称为年度最佳动画、影……如何通过预判用户行为做设计?来看大厂产品是怎么做的有时候我们会发现一些产品非常好用,当我们想要什么,界面上就会出现什么。比如双十一大促来临,我们想要咨询客服的时候,淘宝就会自动联想出我们可能会咨询的问题,非常方便快捷。……卧底巨星曝首款海报陈奕迅李荣浩歌王变身小金人由谷德昭执导,陈奕迅、李荣浩、李一桐主演的喜剧动作电影《卧底巨星》,今日公布了首款小金人版海报。金色的海报中,陈奕迅与李荣浩穿着印上两人剧中名字的服装,各自摆出武打招数背对而立……假如王子睡着了定档12。8陈柏霖林允张云龙温暖上演冬日童话今日,迪士尼首部华语爱情电影《假如王子睡着了》发布定档海报,正式宣布电影将于12月8日全国公映。最新发布的水晶球版海报延续迪士尼经典的童话基因,主打梦幻小浪漫风,陈柏霖、林允、……比亚迪代工的松散机车,到底是什么来头?松散机车SongSanMotors一家致力于机车个性化改装美式风格国产品牌早年间主要生产大排量定制化美式巡航机车属于一家比较小众……2022杜卡迪攀爬者Urban发布钢丝轮毂配加高挡泥板野味十DUCATI官方发布了SCRAMBLER车系中的两个新版本:分别是向长达50年的气冷L2引擎历史致敬的老大哥1100TributePRO,而另一个便是我们这次的主角采用较为清亮……导演兼主演一个人撑起来一部七十七天顽强而美丽!今天给大家安利一部大型西藏美景风情专属影片《七十七天》,故事讲述男主角独自一人骑自行车横穿羌塘无人区。印象中比较深刻的主角自己一人撑起来一部戏的就是《地心引力》和《少年派的奇幻……卧底巨星曝先导预告陈奕迅李荣浩抢女人由谷德昭执导,陈奕迅、李荣浩、李一桐主演的喜剧动作电影《卧底巨星》公布了超豪华阵容先导预告片,电影中的人物形象与卧底巨星间错综复杂的人物关系也随着预告的发布,逐渐清晰立体。超豪……智能启蒙时代,卢卡PK牛听听谁更获得家长欢心?和别的家长一样,笔者也十分注重对孩子的启蒙教育,除了言传身教之外也使用先进的智能启蒙设备培养孩子全面发展,协助孩子养成对学习的兴趣,加深他的求知欲。智能早教设备有很多好处……精准扶贫携手焦裕禄精神十八洞村全国公益巡映落地兰考10月25日,《十八洞村》全国公益巡映来到河南兰考张庄村。为践行习近平总书记坚持以人民为中心的价值取向,展示精准扶贫政策成果,沿着总书记提出精准扶贫理念的足迹,《十八洞村》全国……朱时茂来郑宣传胡杨的夏天新片为网红正名获赞!10月24日,朱时茂携新作《胡杨的夏天》来郑州奥斯卡大上海国际影城举办见面会,这部喜剧爱情电影是朱时茂转型导演后的又一力作,也是朱时茂和陈佩斯这对春晚面条CP阔别荧幕多年后再度……人工智能助推数字法院,宝德打造标杆案例依法治国始终作为党领导人民治理国家的基本方略,推动社会主义法治建设不断前进。在持续发展的数字时代,一方面,伴随着数字经济高速发展,互联网产业规模持续扩大,传统法律体系向数字世界……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网