【Java编程规范】鲁棒性篇

  • 【强制】注意 Math.random() 这个方法返回是double类型,注意取值的范围 0≤x<1(能够取到零值,注意除零异常),如果想获取整数类型的随机数,不要将x放大10的若干倍然后取整,直接使用Random对象的nextInt或者nextLong方法。

  • 工具类中屏蔽构造函数
    工具类是一堆静态字段和函数的集合,其不应该被实例化;但是,Java 为每个没有明确定义构造函数的类添加了一个隐式公有构造函数,为了避免不必要的实例化,应该显式定义私有构造函数来屏蔽这个隐式公有构造函数。

  • 避免使用BigDecimal(double)
    BigDecimal(double) 存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。

    1
    2
    3
    4
    5
    6
    7
    //反例:

    // BigDecimal 反例
    BigDecimal bigDecimal = new BigDecimal(0.11D);
    //正例:
    // BigDecimal 正例
    BigDecimal bigDecimal1 = bigDecimal.valueOf(0.11D);
  • 返回空数组和集合而非 null
    若程序运行返回null,需要调用方强制检测null,否则就会抛出空指针异常;返回空数组或空集合,有效地避免了调用方因为未检测null 而抛出空指针异常的情况,还可以删除调用方检测null 的语句使代码更简洁。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //反例:
    //返回null 反例
    public static Result[] getResults() {
    return null;
    }

    public static Map<String, Result> getResultMap() {
    return null;
    }
    //正例:
    //返回空数组和空集正例
    public static Result[] getResults() {
    return new Result[0];
    }

    public static Map<String, Result> getResultMap() {
    return Collections.emptyMap();
    }

*【强制】在一个switch块内,每个case要么通过break/return等来终止,要么注释说明程序将继续执行到哪一个case为止;在一个switch块内,都必须包含一个default语句并且放在最后,即使空代码。