新来了个技术总监:谁再在 POJO 中使用基本数据类型,以后就不用来了!

Hollis优质文章约 1134 字大约 4 分钟

大家好,我是程序汪

程序员编码时一些不经意的细节可能导致一些很难察觉的BUG,上生产运行一段时间后才发现,真的很头疼。

在《阿里巴巴Java开发手册》中,对于POJO中如何选择变量的类型以及 RPC 接口中的返回值类型也有着一些规定:

这里强制要求使用包装类型,原因是什么呢?

我们来看一段简单的代码

/**  

 * @author Hollis  

 */  

public class BooleanMainTest {  

  

    public static void main(String[] args) {  

        Model model1 = new Model();  

        System.out.println("default model : " + model1);  

    }  

}  

  

class Model {  

    /**  

     * 定一个Boolean类型的success成员变量  

     */  

    private Boolean success;  

    /**  

     * 定一个boolean类型的failure成员变量  

     */  

    private boolean failure;  

  

    /**  

     * 覆盖toString方法,使用Java 8 的StringJoiner  

     */  

    @Override  

    public String toString() {  

        return new StringJoiner(", ", Model.class.getSimpleName() + "[", "]")  

                .add("success=" + success)  

                .add("failure=" + failure)  

                .toString();  

    }  

}  

以上代码输出结果为:

default model : Model[success=null, failure=false]  

可以看到,当我们没有设置Model对象的字段的值的时候,Boolean类型的变量会设置默认值为null,而boolean类型的变量会设置默认值为false。

即Boolean对象的默认值是nullboolean基本数据类型的默认值是false

也就是说,包装类型的默认值都是null,而基本数据类型的默认值是一个固定值,如boolean是false,byte、short、int、long是0,float是0.0f等;

我们再举一个扣费的例子,我们做一个扣费系统,扣费时需要从外部的定价系统中通过 RPC 请求读取一个费率的值,我们预期该接口的返回值中会包含一个浮点型的费率字段。当我们取到这个值得时候就使用公式:金额*费率=费用 进行计算,计算结果进行划扣。

如果由于计费系统异常,他可能会返回个默认值,如果这个字段是Double类型的话,该默认值为null,如果该字段是double类型的话,该默认值为0.0。

如果扣费系统对于该费率返回值没做特殊处理的话,拿到null值进行计算会直接报错,阻断程序。拿到0.0可能就直接进行计算,得出接口为0后进行扣费了。这种异常情况就无法被感知。

有人说,那我可以对0.0做特殊判断,如果是0一样可以阻断报错啊。但是,这时候就会产生一个问题,如果允许费率是0的场景又怎么处理呢?

所以,使用基本数据类型只会让方案越来越复杂,坑越来越多。

这种使用包装类型定义变量的方式,通过异常来阻断程序,进而可以被识别到这种线上问题。如果使用基本数据类型的话,系统可能不会报错,进而认为无异常。

当然,以上的选择是针对一些电商、支付、金融等场景,可以牺牲暂时的可用性的场景,如果是对于某些软件系统,可以容忍数据不准,但是不能系统不可用的情况要另当别论。

以上,就是要求在POJO和RPC的返回值中使用包装类型的原因。

程序汪资料链接

程序汪接的7个私活都在这里,经验整理open in new window

Java项目分享  最新整理全集,找项目不累啦 07版open in new window

堪称神级的Spring Boot手册,从基础入门到实战进阶open in new window

卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!open in new window

卧槽!阿里大佬总结的《图解Java》火了,完整版PDF开放下载!open in new window

字节跳动总结的设计模式 PDF 火了,完整版开放下载!open in new window

欢迎添加程序汪个人微信 itwang009  进粉丝群或围观朋友圈