BigDecimal.ZERO与新BigDecimal(0)。使用哪个,为什么?

时间:2014-10-14 15:32:26

标签: java bigdecimal

我想知道这两个是否相同。谁能验证? (我试图将第一个替换为第二个)

BigDecimal totalCurrentSales = new BigDecimal(0);

BigDecimal totalCurrentSales = BigDecimal.ZERO;

我问的原因是,由于您不应该创建已存在的BigIntegerBigDecimal (ZERO, ONE, TEN)的实例,因此首先声明它是不合适的。所以我想知道我是否可以说第二种方式,它仍然被认为是创建一个实例。而不是我必须创建变量zero或等于BigDecimal.ZERO的东西。或者还有其他方法吗?

我试过

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);

但日食并不太高兴。

2 个答案:

答案 0 :(得分:30)

在数学上,它们是相同的。另外,由于BigDecimals是不可变的,因此您不必担心创建新实例来进行新计算。只要您在totalCurrentSales实例上执行某些操作,您实际上就会创建一个新的BigDecimal,并将totalCurrentSales引用重新分配给新值。

从实例化的角度来看,它们并不一定完全相同。例如,在OpenJDK 6b14实现中,BigDecimal.ZERO是通过调用值为new BigDecimal(BigInteger, long, int)BigInteger.ZERO0的私有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。