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

本文深入探讨了Java开发中布尔类型变量命名规范,解释了为何不应使用isXXX命名,并分析了基本类型与包装类在实际应用中的优劣。通过JSON序列化案例,说明了命名规范的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平时工作中大家经常使用到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中使用包装数据类型,局部变量使用基本数据类型。
--------------------- 
作者:请叫我小叶子 
来源:优快云 
原文:https://blog.youkuaiyun.com/xiaoye319/article/details/85232719 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>嗯,用户想找一个布尔变量的命名,用于表示是否需要触发排序功能。首先,我需要考虑布尔变量的命名惯例。通常,布尔变量会用“is”、“has”、“should”、“can”这样的前缀,比如isActive、hasPermission。这里的关键是表达“是否需要触发排序”,所以可能需要用“should”或者“need”作为前缀。然后,用户提到的功能是排序,所以变量名里应该包含“sort”或者“sorting”。常见的组合可能有shouldSort、needsSorting、enableSorting。过“enable”可能更多用于启用功能,而是触发动作。比如enableSorting可能表示是否启用排序功能,而用户需要的是触发,也就是当条件满足时执行排序。还要注意变量名的简洁和清晰。比如isSortRequired可能比较准确,但有点长。或者useSorting,但可能够明确。另一个可能是sortTriggered,但这是过去式,可能太适合作为条件判断的变量名。 另外,用户可能需要这个变量在代码中作为标志,控制是否执行排序操作。所以名字应该一目了然,让其他开发者容易理解。比如shouldTriggerSorting,这样既包含了条件判断(should),又明确了动作(triggersorting),可能是一个好的选择。再考虑常见的命名习惯,比如在Java中常用is开头,而JavaScript或Python可能更灵活。管哪种语言,保持一致性很重要。例如,在Java中可能用shouldTriggerSort,而Python中可能用should_trigger_sorting,但用户可能需要考虑语言差异,只需给出通用的建议。可能还需要排除一些太合适的选项。比如sortFlag,虽然简短,但够描述性。或者doSort,这个也错,但可能如shouldTriggerSorting明确。另外,activateSorting可能更偏向于启用,而是触发一次性的动作。 总结一下,比较好的选项可能有:shouldSort、needsSorting、sortRequired、triggerSorting。然后需要根据用户的上下文选择最合适的。如果是在一个函数或方法中作为参数,可能更倾向于简洁,比如shouldSort。如果是类中的属性,可能需要更详细的名字,比如sortingTriggerRequired。最后,还要参考用户提供的引用内容,过看起来引用内容主要关于数据库、日志、排序算法等,可能没有直接相关的命名约定。但需要确保推荐的名称符合一般的编程规范,比如清晰、具有描述性、符合团队约定等。</think>### 布尔变量命名推荐 在编程中,布尔变量命名需清晰表达其用途。针对“是否需要触发排序功能”,推荐以下命名方式: 1. **`shouldTriggerSort`** - 使用`should`前缀明确表示条件判断,例如: ```java boolean shouldTriggerSort = checkSortCondition(); ``` 2. **`needsSorting`** - 强调“需要”触发动作,常用于状态判断: ```python needs_sorting = data.is_unsorted() ``` 3. **`sortRequired`** - 直接描述功能必要性,适用于配置或参数场景: ```javascript const sortRequired = config.enableAutoSort; ``` 4. **`enableSorting`**(若为持续性开关) - 若需长期控制排序功能开关而非单次触发,可用此命名[^3]。 ### 命名原则 - **语义清晰**:通过名称直接反映变量用途(如`trigger`/`required`)。 - **一致性**:与项目中其他布尔变量保持风格统一(如`isXxx`、`hasXxx`)。 - **避免歧义**:如`doSort`可能被误解为立即执行动作而非条件判断。 ### 示例场景 ```java // 根据数据变化动态决定是否排序 boolean shouldTriggerSort = !data.isSorted() && data.size() > 100; if (shouldTriggerSort) { executeQuickSort(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值