根据有效的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);
。