BigDecimal.ZERO vs. new BigDecimal(0).使用哪个,为什么?

2022-09-01 04:24:30

我想知道这两者是否相同。任何人都可以验证吗?(我正在尝试用第2个替换第1个)

BigDecimal totalCurrentSales = new BigDecimal(0);

BigDecimal totalCurrentSales = BigDecimal.ZERO;

我问的原因是,第一种方式声明它是不恰当的,因为你不应该创建已经存在和的实例。所以我想知道我是否可以用第二种方式说出来,它仍然被认为是创建一个实例。而不是我必须创建一个变量或等于 .还是有其他方法?BigIntegerBigDecimal (ZERO, ONE, TEN)zeroBigDecimal.ZERO

我试过了

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);

但日食并不太高兴。


答案 1

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

从实例化的角度来看,它们不一定完全相同。例如,在 OpenJDK 中,6b14 实现是通过调用具有值 、 和 的私有构造函数创建的。BigDecimal.ZEROnew BigDecimal(BigInteger, long, int)BigInteger.ZERO00

从代码质量的角度来看,使用比避免额外的实例化和在代码中使用文本更可取。BigDecimal.ZEROnew BigDecimal(0)


答案 2

BigDecimal没有一个将BigDecimal作为参数的构造函数,所以这就解释了为什么Eclipse对此不满意。

BigDecimal是不可变的,这意味着一旦你创建了一个对象,它的状态永远不会改变。

此外,BigDecimal的等式和哈希码方法被覆盖以按值进行,这与Object的默认实现相反,后者比较引用。因此,从如何使用BigDecimal.ZERO和新的BigDecimal(“0”)的角度来看,它们之间没有区别,除了创建新实例对JVM来说需要更多的工作(并且当您不再需要该对象时会产生更多的垃圾)。

BigDecimal是不可变的和基于值的,这意味着使用什么特定的引用对于使用BigDecimal的代码无关紧要。

由于 BigDecimal.ZERO 已经为您创建了,并且 BigDecimals 之间的比较是按值进行的,因此尽量减少使用的值的数量是有意义的,以便程序创建的垃圾更少。这就是为什么你被鼓励使用BigDecimal.ZERO。


推荐