BigDecimal是可扩展的,并且没有复制构建器.这是安全风险



根据有效的Java项目24(需要在需要时进行防御副本(可变物体会带来安全风险,尤其是当通过作为构造方参数传递时。鼓励人们根据需要制作防御副本。

BigDecimal是不可变的,但不是最终的。根据有效的Java项目15(最小化mutability(,除非最终或所有构造函数都不可扩展。

更糟的是,BigDecimal不提供复制构造函数。

那么,BigDecimal参数是否构成安全风险?一个人应该经历调用new BigDecimal(untrusted.toString())的痛苦过程吗?

根据https://stackoverflow.com/a/33463772/14731:

如有效的Java中所讨论的,第13项,偏爱不可变形,这是一门写作时的设计监督

根据https://stackoverflow.com/a/12600683/14731 bigdecimal确实构成安全风险,应尽可能地制作防御性副本。

看起来是创建防御副本的最快方法是:

public static BigDecimal copyOf(BigDecimal value)
{
    if (value == null || value.getClass() == BigDecimal.class)
        return value;
    return new BigDecimal(value.unscaledValue(), value.scale());
}

更新:显然,现在在有效的Java 3rd Edition,项目17中明确讨论了这一点(最小化Mutiability(。

类似的东西也可以起作用:

BigDecimal newValue = oldValue == null ? null : oldValue.add(BigDecimal.ZERO);

最新更新