1. 在类中定义布尔类型的变量
一般情况下,我们可以有以下四种方式来定义一个布尔类型的成员变量:
boolean success
boolean isSuccess
Boolean success
Boolean isSuccess
以上四种定义形式,你日常开发中最常用的是哪种呢?到底哪一种才是正确的使用姿势呢?
看看阿里巴巴Java开发手册中这条规定的评价
8. 【强制】POJO 类中布尔类型的变量,都不要加 is,否则部分框架解析会引起序列化错误。反例:定义为基本数据类型 boolean isSuccess;的属性,它的方法也是 isSuccess(),RPC框架在反向解析的时候,“以为”对应的属性名称是 success,导致属性获取不到,进而抛出异常。
所以,在定义POJO中的布尔类型的变量时,不要使用isSuccess这种形式,而要直接使用success!
那么,到底应该是用Boolean还是boolean来给定一个布尔类型的变量呢?
我们知道,boolean是基本数据类型,而Boolean是包装类型。
当我们没有设置Model对象的字段的值的时候,Boolean类型的变量会设置默认值为null
,而boolean类型的变量会设置默认值为false
。
8. 关于基本数据类型与包装数据类型的使用标准如下:
1) 【强制】所有的 POJO 类属性必须使用包装数据类型。
2) 【强制】RPC 方法的返回值和参数必须使用包装数据类型。
3) 【推荐】所有的局部变量使用基本数据类型。
说明:POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或者入库检查,都由使用者来保证。
正例:数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。
反例:比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用 不成功时,返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装 数据类型的 null 值,能够表示额外的信息,如:远程调用失败,异常退出。
以上,就是建议在POJO和RPC的返回值中使用包装类型的原因。
当我们在设计一个接口的时候,对于接口的返回值的定义,尽量避免使用Boolean类型来定义。大多数情况下,别人使用我们的接口返回值时可能用if(response.isSuccess){}else{}
的方式,如果我们由于忽略没有设置success
字段的值,就可能导致NPE,这明显是我们不希望看到的。个人觉得统一成数字0和1最好。
当然,编程中并没有绝对。两种方式是两种思维方式,多提供一种思路,在日常开发中自行选择。