Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BigDecimal是可扩展的,没有复制构造函数。这是安全风险吗?_Java_Security_Bigdecimal_Effective Java - Fatal编程技术网

Java BigDecimal是可扩展的,没有复制构造函数。这是安全风险吗?

Java BigDecimal是可扩展的,没有复制构造函数。这是安全风险吗?,java,security,bigdecimal,effective-java,Java,Security,Bigdecimal,Effective Java,根据有效的Java项目24(在需要时制作防御性拷贝),可变对象会带来安全风险,特别是当作为构造函数参数传递时。鼓励一个人在必要时制作防御性副本 BigDecimal是不可变的,但它不是最终的。根据有效的Java项目15(最小化可变性),一个类不能是不可变的,除非它是最终的或者它的所有构造函数都是不可扩展的 更糟糕的是,BigDecimal没有提供复制构造函数 那么,BigDecimal参数是否会带来安全风险?调用新的BigDecimal(untrusted.toString())是否应该经历痛苦

根据有效的Java项目24(在需要时制作防御性拷贝),可变对象会带来安全风险,特别是当作为构造函数参数传递时。鼓励一个人在必要时制作防御性副本

BigDecimal
是不可变的,但它不是最终的。根据有效的Java项目15(最小化可变性),一个类不能是不可变的,除非它是最终的或者它的所有构造函数都是不可扩展的

更糟糕的是,
BigDecimal
没有提供复制构造函数

那么,
BigDecimal
参数是否会带来安全风险?调用新的BigDecimal(untrusted.toString())是否应该经历痛苦的过程

正如《有效Java》第13项“支持不变性”中所讨论的,在编写类时,这是一个设计疏忽

根据BigDecimal的说法,这确实会带来安全风险,必要时应制作防御性副本

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

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

更新:显然,这一点在《有效的Java第三版》第17项(最小化可变性)中已经明确讨论过了。

类似的内容也可以使用:


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

应该
value.getClass()==BigDecimal.class
实际上是
value.getClass()!=BigDecimal.class
?我想你是想防御一个扩展BigDecimal的类,对吧?@patrickmno。如果
value.getClass()==BigDecimal.class
,那么没有扩展发生,可以返回现有实例;否则,我们需要复印一份。我认为这不安全。要么调用
oldValue.add(BigDecimal.ZERO)
,这是不安全的,因为
oldValue
不受信任;要么调用
BigDecimal.ZERO.add(oldValue)
但在不应该信任操作数的情况下,在后台调用
add()
信任操作数。。。