阿里巴巴Java开发手册中的开发规约之一(2)

  |  

阿里巴巴Java开发手册中开发规约之一

  • 关于基本类型与包装类型的使用标准:
  1. 【强制】所有的POJO类属性比如使用包装数据类型。
  2. 【强制】RPC方法的返回值和参数必须使用包装数据类型。
  3. 【推荐】所有的局部变量使用的基本数据类型。


Boolean还是boolean?

我们知道,boolean是基本数据类型,而Boolean是包装类型,当在定义POJO的布尔类型变量的时候,应该使用Boolean还是boolean呢?

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
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
default model : Model[success=null, failure=false]

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

在阿里巴巴规约中是建议我们使用包装类型为什么呢?

  • 举个扣费例子

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

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

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

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

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


boolean对于NPE还有一个注意

当我们在设计一个接口的时候,对于接口的返回值的定义,尽量避免使用Boolean类型来定义。大多数情况下,别人使用我们的接口返回值时可能用if(response.isSuccess){}else{}的方式,如果我们由于忽略没有设置success字段的值,就可能导致 NPE,这明显是我们不希望看到的。

Copyright © 2018 - 2020 Kuanger All Rights Reserved.

访客数 : | 访问量 :