我想知道这两个是否相同。谁能验证? (我试图将第一个替换为第二个)
BigDecimal totalCurrentSales = new BigDecimal(0);
和
BigDecimal totalCurrentSales = BigDecimal.ZERO;
我问的原因是,由于您不应该创建已存在的BigInteger
和BigDecimal (ZERO, ONE, TEN)
的实例,因此首先声明它是不合适的。所以我想知道我是否可以说第二种方式,它仍然被认为是创建一个实例。而不是我必须创建变量zero
或等于BigDecimal.ZERO
的东西。或者还有其他方法吗?
我试过
BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);
但日食并不太高兴。
答案 0 :(得分:30)
在数学上,它们是相同的。另外,由于BigDecimals是不可变的,因此您不必担心创建新实例来进行新计算。只要您在totalCurrentSales
实例上执行某些操作,您实际上就会创建一个新的BigDecimal,并将totalCurrentSales
引用重新分配给新值。
从实例化的角度来看,它们并不一定完全相同。例如,在OpenJDK 6b14实现中,BigDecimal.ZERO
是通过调用值为new BigDecimal(BigInteger, long, int)
,BigInteger.ZERO
和0
的私有0
构造函数创建的。
从代码质量的角度来看,使用BigDecimal.ZERO
优于new BigDecimal(0)
,因为您可以避免额外的实例化并在代码中使用文字。
答案 1 :(得分:7)
BigDecimal没有将BigDecimal作为参数的构造函数,因此这解释了为什么Eclipse会对此不满意。
BigDecimal是不可变的,这意味着一旦你创建了一个对象,它的状态永远不会改变。
BigDecimal的equals和hashcode方法也被重写为value,而不是Object的默认实现,它比较了引用。因此,从使用它们的角度来看,BigDecimal.ZERO和新BigDecimal(“0”)之间没有区别,除了创建一个新实例对JVM来说更多的工作(并且当你没有时会产生更多的垃圾)不再需要那个对象了。
BigDecimal是不可变的,基于值的意味着使用特定引用对使用BigDecimal的代码无关紧要。
因为BigDecimal.ZERO已经为您创建并且BigDecimals之间的比较是按值进行的,所以最小化您使用的值的数量是有意义的,这样您的程序可以减少垃圾。这就是为什么你被鼓励使用BigDecimal.ZERO。