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

平时工作中大家经常使用到boolean以及Boolean类型的数据,前者是基本数据类型,后者是包装类,为什么不推荐使用isXXX来命名呢?到底是用基本类型的数据好呢还是用包装类好呢?

一、为什么不推荐使用isXXX来命名布尔类型的数据

        其实阿里巴巴发布的java开发手册中就写明了,强制规定,布尔类型的数据,无论是boolean还是Boolean都不准使用isXXX来命名。

       为了测试出结果,我创建了四个实体类,分别定义了不同的属性,boolean testBoolean、boolean isTestBoolean、

Boolean testBoolean、Boolean isTestBoolean,结果如下:

 从图上可以看出:

       基本数据类型自动生成的getter和setter方法的名称都是isXXX()和setXXX()

       包装类自动生成的getter和setter方法的名称都是getXXX()和setXXX()

       其实javaBeans规范中对这些均有相应的规定,基本数据类型的属性,其getter和setter方法是getXXX()和setXXX,但是对于基本数据中布尔类型的数据,又有一套规定,其getter和setter方法是isXXX()和setXXX,感兴趣的同学可以自己搜搜这个规范看看,这里我就不贴出来了。

       平时使用的时候可能不会出什么问题,但是在json序列化对象的时候就会出问题,我前面的文章讲过gson、fastJson、jackJson都是怎样序列化对象的,感兴趣的同学可以找我的另一篇博客《fastJson、JackJson以及Gson序列化对象与get、set以及对象属性之间的关系》。当这三个工具对对象进行序列化时,Gson只会通过反射遍历获取到属性,然后将其值进行序列化,但是fastJson和JackJson是反射遍历获取对象的getter方法,然后会通过相应的JavaBeans规则,认为getXXX或者isXXX后面就是属性,然后进行序列化。所以使用isXXX来定义属性名字的,通过jackJson和fastJson序列化出来的结果,总是比通过Gson序列化出来的结果多一个属性。我们就以TestBoolean1和TestBoolean2进行序列化来对比结果:

从图可以看出:若不使用的isXXX来定义属性名,三个工具序列化的结果一样的,这没什么问题。

下面是命名为isXXX的属性,序列化以后的结果如下:

可以看出,序列化后的结果如上,会发现Gson序列化后的结果跟JackJson以及fastJson的结果不一致。说到底还是序列化的方式不同,那么问题就来了,当设置isTestBoolean为true,当使用fastJson进行序列化以后再通过Gson进行反序列化,结果就会出问题:

 

你会发现本来给isTestBooleanf赋值的是true,但是反序列化以后的结果是false,跟我们想要的结果不一致。

       究其原因,fastJson通过反射遍历找到isTestBoolean方法,基于javaBeans规范,认为这个类的属性是testBoolean,然后获取其值,将其序列化为{"testBoolean",true},然后Gson解析字符串,通过testBoolean找该类的属性,结果发现该类就一个属性isTestBoolean,没有testBoolean属性。因此Gson反序列化后TestBoolean2中的isTestBoolean会使用其默认值false,而不是我们想要的true。因此,阿里巴巴的java开发手册强制规定,布尔类型的数据,不要用isXXX来命名。

二、工作中使用基本类型的数据好还是包装类好

       咱们举个例子,一个计算盈利的系统,其盈利比例有正有负,若使用了基本类型bouble定义了数据,当RPC调用时,若出现了问题,本来应该返回错误的,但是由于使用了基本类型,返回了0.0,系统会认为没有任何问题,今年收支平衡,而不会发现其实是出现了错误。若使用了包装数据类型Double,当RPC调用失败时,会返回null,这样直接就能看到出现问题了,而不会因为默认值的问题影响判断。

       其实阿里java开发手册中对于这个也有强制规定:

       因此,这里建议大家POJO中使用包装数据类型,局部变量使用基本数据类型。
--------------------- 
作者:请叫我小叶子 
来源:CSDN 
原文:https://blog.csdn.net/xiaoye319/article/details/85232719 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值