阿里巴巴为什么不建议 boolean 类型变量用 isXXX

简介: 为什么不推荐使用 isXXX 来命名呢?到底是用基本类型的数据好呢还是用包装类好呢?

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

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

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

阿里巴巴为什么不建议 boolean 类型变量用 isXXX1.png

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

Boolean testBoolean、Boolean isTestBoolean,结果如下:

阿里巴巴为什么不建议 boolean 类型变量用 isXXX2.png

阿里巴巴为什么不建议 boolean 类型变量用 isXXX3.png

从图上可以看出:

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

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

平时使用的时候可能不会出什么问题,但是在 Json 序列化对象的时候就会出问题,比如 Gson、FastJson、JackJson。当这三个工具对对象进行序列化时,Gson 只会通过反射遍历获取到属性,然后将其值进行序列化,但是 FastJson 和 JackJson 是反射遍历获取对象的 getter 方法,然后会通过相应的 JavaBeans 规则,认为 getXXX 或者 isXXX 后面就是属性,然后进行序列化。

所以使用 isXXX 来定义属性名字的,通过 JackJson 和 FastJson 序列化出来的结果,总是比通过 Gson 序列化出来的结果多一个属性。我们就以 TestBoolean1 和 TestBoolean2 进行序列化来对比结果:

阿里巴巴为什么不建议 boolean 类型变量用 isXXX4.png

阿里巴巴为什么不建议 boolean 类型变量用 isXXX5.png

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

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

阿里巴巴为什么不建议 boolean 类型变量用 isXXX6.png

阿里巴巴为什么不建议 boolean 类型变量用 isXXX7.png

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

阿里巴巴为什么不建议 boolean 类型变量用 isXXX8.png

阿里巴巴为什么不建议 boolean 类型变量用 isXXX9.png

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

究其原因,FastJson 通过反射遍历找到 isTestBoolean 方法,基于 JavaBeans 规范,认为这个类的属性是 testBoolean,然后获取其值,将其序列化为 {"testBoolean",true},然后 Gson 解析字符串,通过 testBoolean 找该类的属性,结果发现该类就一个属性 isTestBoolean,没有 testBoolean 属性。

因此 Gson 反序列化后 TestBoolean2 中的 isTestBoolean 会使用其默认值 false,而不是我们想要的 true。因此,阿里巴巴的 Java 开发手册强制规定,布尔类型的数据,不要用 isXXX 来命名。

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

咱们举个例子,一个计算盈利的系统,其盈利比例有正有负,若使用了基本类型 double 定义了数据,当 RPC 调用时,若出现了问题,本来应该返回错误的,但是由于使用了基本类型,返回了 0.0,系统会认为没有任何问题,今年收支平衡,而不会发现其实是出现了错误。

若使用了包装数据类型 Double,当 RPC 调用失败时,会返回null,这样直接就能看到出现问题了,而不会因为默认值的问题影响判断。

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

阿里巴巴为什么不建议 boolean 类型变量用 isXXX10.png

因此,这里建议大家 POJO 中使用包装数据类型,局部变量使用基本数据类型。

来源:
https://blog.csdn.net/xiaoye319/article/details/85232719

相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
33250 201
如何保证分布式文件系统的数据一致性
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36820 22
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24905 16
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36824 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29948 52

热门文章

最新文章