POJO类中属性必须使用包装数据类型

在阿里巴巴Java开发手册中,对于POJO中如何选择变量的类型也有着一些规定:
在这里插入图片描述
这里强制要求使用包装类型,原因是什么呢?
1、我们来看一段简单的代码

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。
即对象的默认值是null,boolean基本数据类型的默认值是false
也就是说,包装类型的默认值都是null,而基本数据类型的默认值是一个固定值,如boolean是false,byte、short、int、long是0,float是0.0f等。

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

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

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

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

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

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

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

如果方法中需要使用POJO的一些属性,可以在装饰器类中添加 POJO 型的成员变量,并在构造函数中初始化,在装饰器类中使用这些属性。 具体实现过程如下: 1. 定义 POJO : ```java public class MyPojo { private String property1; private String property2; // ... 省略 getter 和 setter 方法 } ``` 2. 定义接口,包含需要解耦的方法: ```java public interface MyInterface { void myMethod(); } ``` 3. 实现实现接口,并在方法中使用 POJO 属性: ```java public class MyClass implements MyInterface { private MyPojo pojo; public MyClass(MyPojo pojo) { this.pojo = pojo; } @Override public void myMethod() { // 使用 POJO 属性 String property1 = pojo.getProperty1(); String property2 = pojo.getProperty2(); // 其他操作 } } ``` 4. 定义装饰器,实现接口并在构造函数中传入实现POJO 对象: ```java public class MyDecorator implements MyInterface { private MyInterface myClass; private MyPojo pojo; public MyDecorator(MyInterface myClass, MyPojo pojo) { this.myClass = myClass; this.pojo = pojo; } @Override public void myMethod() { // 使用 POJO 属性 String property1 = pojo.getProperty1(); String property2 = pojo.getProperty2(); // 装饰需要解耦的方法 myClass.myMethod(); } } ``` 5. 在代码中使用装饰器: ```java MyPojo pojo = new MyPojo(); MyInterface obj = new MyClass(pojo); MyInterface decoratedObj = new MyDecorator(obj, pojo); decoratedObj.myMethod(); ``` 这样,装饰器就将需要解耦的方法和实现POJO 解耦了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值