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

erp*_*erp 26 java bigdecimal

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

BigDecimal totalCurrentSales = new BigDecimal(0);
Run Code Online (Sandbox Code Playgroud)

BigDecimal totalCurrentSales = BigDecimal.ZERO;
Run Code Online (Sandbox Code Playgroud)

我想问的原因是,它是不恰当的,第一种方式宣告它,因为你不应该创建已有的实例BigIntegerBigDecimal (ZERO, ONE, TEN).所以我想知道我是否可以说第二种方式,它仍然被认为是创建一个实例.而不是我必须创建一个变量zero或等于的变量BigDecimal.ZERO.或者还有其他方法吗?

我试过了

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);
Run Code Online (Sandbox Code Playgroud)

但日食并不太快乐.

bdk*_*her 36

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

从实例化的角度来看,它们不一定完全相同.在OpenJDK的6b14实现,例如,BigDecimal.ZERO通过调用私人创建的new BigDecimal(BigInteger, long, int)构造函数值BigInteger.ZERO,00.

从代码质量的角度来看,使用BigDecimal.ZERO是优选的,new BigDecimal(0)因为您可以避免额外的实例化并在代码中使用文字.

  • 你所说的最后一段真的是我一直在寻找的东西.这里的敌意离开了排行榜.感谢您的答复.一个清晰简洁的答案.+1 (4认同)

Nat*_*hes 8

BigDecimal没有将BigDecimal作为参数的构造函数,因此这解释了为什么Eclipse会对此不满意.

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

此外,BigDecimal的equals和hashcode方法被重写为value,而不是Object的默认实现,它比较了引用.因此,从使用它们的角度来看,BigDecimal.ZERO和新BigDecimal("0")之间没有区别,除了创建一个新实例对JVM来说更多的工作(并且当你没有时会产生更多的垃圾)不再需要那个对象了.

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

因为BigDecimal.ZERO已经为您创建并且BigDecimals之间的比较是按值进行的,所以最小化您使用的值的数量是有意义的,这样您的程序可以减少垃圾.这就是为什么你被鼓励使用BigDecimal.ZERO.

  • 我最初打算使用“BigDecimal.ZERO;”,我只是想理解操作中评论中的所有来回内容。谢谢你的回复。我本想检查一下,但我先看到了另一个。+1表示友善:) (2认同)