为什么阿里巴巴强制要求使用包装类型定义属性?

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

[[428024]]

在阿里巴巴Java开发手册中,对于POJO中如何选择变量的类型也有着一些规定:

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

我们来看一段简单的代码

 /** 
 
 * @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(); 
 
    } 
 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.

以上代码输出结果为:

default model : Model[success=null, failure=false
  • 1.

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

即对象的默认值是null,boolean基本数据类型的默认值是false。

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

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

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

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

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

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

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

 

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

 

责任编辑:武晓燕 来源: Hollis
相关推荐

2020-09-14 09:47:56

Java开发类型

2022-03-14 09:41:10

POJO类型系统

2019-06-26 07:54:53

ArrayListsubList源码

2023-04-03 07:03:51

阿里巴巴List元素

2020-07-30 12:16:33

阿里巴巴Apache对象

2020-09-08 16:25:18

Apache BeancopyJava

2021-10-20 14:53:31

Foreach强制阿里巴巴

2018-10-16 15:34:17

阿里巴巴Apache Flin大数据

2021-08-04 17:20:30

阿里巴巴AsyncJava

2013-08-22 09:26:38

去IOE王坚

2019-09-02 15:20:28

Java开发继承

2019-09-04 11:02:54

继承层次组合

2018-12-29 15:41:41

阿里巴巴程序员serialVersi

2016-09-21 20:28:55

阿里巴巴IOE

2020-09-22 11:40:53

BigDecimalequalsJava

2021-09-07 17:22:43

阿里巴巴辞职高薪

2010-06-28 10:43:47

2022-08-22 08:07:45

DruidMySQL密码

2022-09-05 10:06:21

MySQL外循环内循环

2020-08-05 11:30:59

日期格式化代码Java
点赞
收藏

51CTO技术栈公众号