程序员新人上午使用 isXxx 形式定义布尔类型,下午就被劝退?

Qt中多线程的使用(一) 我们要实现的是读取大文件qtgui.index的内容加入文本框中。 很容易想到的方法: QFile* file = new QFile("E:\qtgui.index"); file->open(QIODevice::ReadOnly); QTextStream *stream = new QTextStream(file); while(!st... 阅读详情

小二是新来的背锅侠,哦,不不不,新来的实习生。面试过程中表现得非常不错,各种问题对答如流,老板和我都倍感欣慰。

这么优秀的人,绝不能让他浪费一分一秒,于是很快,我就给他安排了一个非常简单的任务。

大家都知道,在日常开发中,我们会经常要在类中定义布尔类型的变量,比如在给外部系统提供一个 RPC 接口的时候,我们一般会定义一个字段表示本次请求是否成功的。

关于这个”本次请求是否成功”的字段的定义,我见过很多不同的开发者,定义的方式都不同,尤其是在属性的命名上,有人用 success,有人用 isSuccess 表示。

从语义上面来讲,两种命名方式都可以讲的通,并且也都没有歧义。

这不,小二就采用了 isSuccess 的形式来定义布尔类型的变量,于是下午 review 的时候就被眼尖的老板揪了出来。老板毕竟是在阿里待过的,对这些细节扣的很细。

于是大发雷霆,准备当场劝退小二,被我拦了下来。毕竟自己面试的人,不看僧面看佛面,是吧?于是老板答应我说再试用一个月看看。

isSuccess 会有什么问题呢?小二很是不解。

那根据 JavaBeans Specification 的规定,如果是普通的参数 propertyName,要以以下方式定义其 setter/getter:

public <PropertyType> get<PropertyName>();
public void set<PropertyName>(<PropertyType> a);

但是,布尔类型的变量 propertyName 则是单独定义的:

public boolean is<PropertyName>();
public void set<PropertyName>(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 getWanger(){
       return "hollis";
   }
}

在这个 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 :{"wanger":"hollis","success":true}

Serializable Result With Gson :{"isSuccess":true}

Serializable Result With jackson :{"success":true,"wanger":"hollis"}

在 fastjson 和 jackson 的结果中,原来类中的 isSuccess 字段被序列化成 success,并且其中还包含 wanger 值。而 Gson 中只有 isSuccess 字段。

我们可以得出结论:fastjson 和 jackson 在把对象序列化成 json 字符串的时候,是通过反射遍历出该类中的所有 getter 方法,得到 getHollis 和 isSuccess,然后根据 JavaBeans 规则,他会认为这是两个属性 hollis 和 success 的值。直接序列化成 json:

{“wanger”:”沉默王二”,”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 规范的。无论哪种序列化框架,执行结果都一样。就从源头避免了这个问题。


没有什么使我停留——除了目的,纵然岸旁有玫瑰、

微软商店报错“此产品当前不可用”?终极修复指南 阅读详情

相关推荐

STM32G4实战:用CubeMX+Keil五分钟搞定FreeRTOS多任务LED控制(避坑指南)

本文详细介绍了如何在STM32G4系列芯片上使用CubeMX和Keil快速配置FreeRTOS实现多任务LED控制,包括环境准备、时钟配置、任务创建及常见问题解决方案。重点解决了时钟源冲突等高频问题,并提供了优化建议和进阶应用示例,帮助开发者高效完成嵌入式开发任务。

joy55的博客 221

关于boolean类型的数据不推荐使用isXXX命名的那些事

平时工作中大家经常使用到boolean以及Boolean类型的数据,前者是基本数据类型,后者是包装类,为什么不推荐使用isXXX来命名呢?到底是用基本类型的数据好呢还是用包装类好呢? 一、为什么不推荐使用isXXX来命名布尔类型的数据 其实阿里巴巴发布的java开发手册中就写明了,强制规定,布尔类型的数据,无论是boolean还是Boolean都不准使用isXXX来命名。 ...

qq_37080458的博客 2444

摄像头visio_最全面弱电智能VISIO图标集(百个),高大上方案就靠这个了

原标题:最全面弱电智能VISIO图标集(百个),高大上方案就靠这个了不会用Visio,Visio画拓扑画的很丑,怎么办?本期sin66小编免费分享一份最全面的弱电智能VISIO图标集(百个)给大家,以后画拓扑、做方案,直接高大上起来!需要本期资料直接看文末!!接下来我们一起看一下这些Visio图标大全:我们从下图可以看出前端设备主要是由枪机,筒机,无线摄像头,半球,球机,USB摄像头等构成,对于绘...

weixin_39644915的博客 1万+

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

△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第384篇原创分享作者 l Hollis来源 l Hollis(ID:hollischuang)在日常开发中,我...

HollisChuang's Blog 2575

12V电源电路五层防护设计实战指南

12V电源电路是工业控制、车载电子和智能终端中最基础的供电架构,其可靠性不取决于稳压精度,而取决于对反接、浪涌、短路、过温等典型故障的响应能力。理解TVS钳位原理、P-MOSFET防反接机制及eFuse可编程限流逻辑,是构建鲁棒电源系统的核心。技术价值在于将保护从‘事后补救’升级为‘事前拦截’,显著提升产品MTBF并降低售后返修率。典型应用场景涵盖PLC辅助电源、ADAS摄像头供电、IoT网关主板等严苛环境设备。本文聚焦12V输入端到负载输出端的五层串行防护链设计,深度融合TVS选型、MOSFET导通阈值与

weixin_30983965的博客 294

FPGA实战:用DDR3和乒乓操作解决视频帧撕裂问题(附Verilog代码)

本文详细介绍了如何利用DDR3内存和乒乓操作架构解决FPGA视频处理中的帧撕裂问题。通过多帧缓存原理、AXI接口配置和自适应乒乓操作设计,有效隔离读写操作,确保视频流稳定传输。文章包含Verilog代码实现和性能优化技巧,适用于工业相机、医疗影像等高速视频处理场景。

m2n3b4v5c6的博客 289

Java中boolean类型属性is丢失问题分析及序列化时注意事项

在阿里开发手册中,强制规定不要在布尔类型的字段上使用is作为前缀来定义方法,而应该采用其他方式。原因在于JavaBeans Specification对于普通参数和布尔类型参数的命名规则是不同的。具体来说,对于普通参数,getter和setter方法以get和set开头,而对于布尔类型参数,setter方法仍然以set开头,但getter方法则以is开头。

程序员小屋 6488

FID指标实战:如何用Python快速计算生成图像的质量分数(附完整代码)

本文详细介绍了如何使用Python计算Fréchet Inception Distance(FID)指标,以评估生成图像的质量。通过完整的代码示例和优化技巧,帮助开发者快速实现FID计算,并解读分数背后的实际意义,适用于GAN和扩散模型的性能评估。

weixin_28718487的博客 374

java布尔字段用is前缀_POJO类中布尔类型为啥不让用isXxx命名

源码面前,了无秘密《阿里开发规范泰山版》(2020.04.22)-->编程规约-->(一) 命名风格-->第8条规定:【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。对于这样一条【强制】级别的规定,虽然规范中做了简单的说明,但依然显得很不起眼,以至于我虽然规范背的很熟,依然踩到了这个坑。0 起因最近写了一个钉钉告警工具类,对于这...

weixin_33171058的博客 1297

从零开始:手把手教你用Verilog搭建一个可配置的Cache模块(以Vortex GPGPU为例)

本文详细介绍了如何使用Verilog从零开始搭建一个可配置的Cache模块,以Vortex GPGPU为例。内容涵盖Cache设计基础、模块接口与参数化设计、核心子模块实现、仲裁与一致性机制、功能验证与性能调优等关键环节,适合RTL设计初学者和希望深入理解Cache工作原理的工程师。通过实战指南,读者可以掌握硬件代码分析技巧,提升Cache模块的设计能力。

weixin_42552315的博客 440

从4A架构的角度出来 帮我分析一下:数字化转型深水区:企业架构如何成为价值重构的核心引擎?

4A 架构的本质是构建企业的数字神经系统,通过业务感知、数据传输、决策执行、技术支撑的闭环,实现从效率提升到生态重构的质变。正如华为通过该架构实现全球研发资源统一调度,某零售集团借此打造线上线下融合的新零售体系,当业务、数据、应用、技术四个维度形成共振时,企业将获得持续进化的数字免疫力,在不确定的市场环境中保持韧性生长。这一过程不仅需要技术工具的升级,更依赖组织文化的变革 —— 从 “部门墙” 到 “能力网” 的转型,才是数字化转型深水区的终极挑战。

金牌架构师 1044

Java类中的任何布尔类型的变量,都不要加 is 前缀

POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列 化错误。MySQL 规约中的建表约定第一条,表达是与否的变量采用 is_xxx 的命名方式,所以,需要在设置从 is_xxx 到 xxx 的映射关系。反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

gorylee的博客 2476

把 SAP S/4HANA 中的 Maintain Email Templates 用好:从模板维护、语言变体、业务绑定到传输治理的完整实践

摘要:SAP邮件模板管理常被低估,实则关乎审批通知、业务提醒等关键输出。官方推荐通过复制标准模板实现自定义,而非直接修改标准内容,以保持核心稳定。模板维护涉及语言变体、业务绑定、数据传输等治理环节,需业务顾问与开发团队协作确保字段来源与渲染逻辑。实施时需注意Fiori配置、权限分配及传输管理,避免测试与生产环境差异。模板设计应平衡灵活性与复杂度,遵循分层测试策略(内容、数据、流程),并建立命名规范以维护资产清晰度。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 66

恕我直言:程序员大部分时间不是在写代码,而是。。。

欢迎关注方志朋的博客,回复”666“获面试宝典作者 | feenk 整理 | 梦依丹 出品 | 优快云(ID:优快云news)面对冷冰冰的机器、代码、工具,程序员的首要工作是知其然并知其所以然,方能入手去敲打出美妙的代码。近日,一篇《Developers spend most of their time figuring the system out》的文章在H...

方志朋的博客 351

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

劲爆!Java 通用泛型要来了。。

欢迎关注方志朋的博客,回复”666“获面试宝典来源:OSC开源社区(ID:oschina2013)Infoworld 消息指出,根据 OpenJDK 提案,Java 将获得通用泛型(universal generics),此举旨在使该语言更易于使用。不过该规划本身需要花费数年时间才能实现。通用泛型最初将通过 OpenJDK 社区中的三个提案来实现。甲骨文方面表示,这些提...

方志朋的博客 61

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

再见,Java泛型 T、E、K、V、?。通用泛型要来了,非常劲爆!

Infoworld 消息指出,根据 OpenJDK 提案,Java 将获得通用泛型(universal generics),此举旨在使该语言更易于使用。不过该规划本身需要花费数年时间才能实现。通用泛型最初将通过 OpenJDK 社区中的三个提案来实现。甲骨文方面表示,这些提议将极大地改变 Java 语言和 JVM,结合类的灵活性和基元的性能。一切(包括基元)都将成为一个...

码农code之路 201

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Tomcat太重,Undertow轻量多了~

欢迎关注方志朋的博客,回复”666“获面试宝典前言在 SpringBoot 框架中,我们使用最多的是 Tomcat,这是 SpringBoot 默认的容器技术,而且是内嵌式的 Tomcat。同时,SpringBoot 也支持 Undertow 容器,我们可以很方便的用 Undertow 替换 Tomcat,而 Undertow 的性能和内存使用方面都优于 Tomcat,那...

方志朋的博客 257

再见收费的Navicat,操作所有数据库就靠它了!

作为一名开发者,免不了要和数据库打交道,于是我们就需要一款顺手的数据库管理工具。很长一段时间里,Navicat 都是我的首选,但最近更换了一台新电脑,之前的绿色安装包找不到了。于是就琢磨着,找一款免费的,功能和 Navicat 有一拼的数据库管理工具来替代。好朋友 macrozheng 给我推荐了 DBeaver,试用完后体验真心不错,于是就来给大家安利一波。一、关于 D...

码农code之路 1356

一个boolean属性名以is开头的深坑

java命名规范指出,boolean类型变量命名禁用is开头。 为了通俗易懂,举个例子来看看: 编写一个结果数据集类,用于存放有用的相应信息,其中有一个boolean类型。 @Data public class ResultVo { private boolean isOk; private String isMan; private Integer isPanda; private float isBanana; } 从下图可以看到,在调用该类的

m0_57545353的博客 2264

Java类声明boolean类型isXXX解析异常 -is+大写变量名字 传值到jsp,传不过去

java类主要代码: private boolean isExits=false; private boolean isexits=false; private boolean ssExits=false; private boolean isFlag = false; private boolean isflag = false;然后是get、set方法;jsp代码:              ...

落霞朝阳七千里,夏雨冬雪九万顷 2255

Unrecognized field “isXXX“ (class com.), not marked as ignorable (15 known properties

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "isShow" (class com.xm.dto.

abments的博客 754

java布尔字段用is前缀_POJO类中布尔类型的变量都不要加is前缀详解

前言对应阿里巴巴开发手册第一章的命名风格的第八条。【强制】 POJO类中布尔类型的变量都不要加is前缀,否则部分框架解析会引起序列化错误。反例:定义为基本数据类型Boolean isDeleted; 的属性,它的方法名称也是 isDeleted(),RPC框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致属性获取不到抛出异常。我对这个反例感觉有点怪怪的,基本数据类型Boolean...

weixin_35754676的博客 3913
上一篇: SpringBoot 一个接口同时支持 form 表单、form-data、json 的优雅写法
下一篇: 堪称2022最强八股文,569个人据此进入大厂。
Java5658
博客等级 码龄4年 169粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值