【问题标题】:BigDecimal.ZERO vs. new BigDecimal(0). Which to use and why?BigDecimal.ZERO 与新的 BigDecimal(0)。使用哪个,为什么?
【发布时间】:2014-10-14 15:32:26
【问题描述】:

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

BigDecimal totalCurrentSales = new BigDecimal(0);

BigDecimal totalCurrentSales = BigDecimal.ZERO;

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

我试过了

BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);

但是eclipse不太开心。

【问题讨论】:

  • 如果你真的理解了这些概念,那么你可能已经知道解决方案:使用后者BigDecimal totalCurrentSales = BigDecimal.ZERO;
  • BigDecimal.ZERO 不是新实例。它是对现有实例的引用。
  • 为什么需要一个 new 实例? @dusky 已经澄清 BigDecimal 是不可变的。
  • 那么我最初所说的是否正确? BigDecimal totalCurrentSales = BigDecimal.ZERO; 和你说的既然它是不可变的,那么说new 是没有意义的?
  • @erp 您不必在此处创建新实例,因为已经有一个 (BigDecimal.ZERO)。 BigDecimal.ZERO 永远不会改变。它总是必须为 0。

标签: java bigdecimal


【解决方案1】:

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

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

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

【讨论】:

  • 你所说的最后一段确实是我一直在寻找的。这里的敌意是超乎想象的。感谢您的答复。一个清晰简洁的答案。 +1
  • 使用不同的构造函数会导致BigDecimal.ZERO 被“膨胀”,而new BigDecimal(0) 在内部使用数字的紧凑表示。这可能会影响性能。
  • 我只需要知道解决方案,因为它出现在声纳错误中。我知道在性能方面它可以忽略不计,但只是想让它处于首选状态,因为这就是声纳的首要任务。
【解决方案2】:

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

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

BigDecimal 的 equals 和 hashcode 方法也被重写为按值运行,这与 Object 的默认实现相反,后者比较引用。因此,从使用方式的角度来看,BigDecimal.ZERO 和 new BigDecimal("0") 之间没有区别,只是创建一个新实例对 JVM 来说需要更多的工作(并且当你不这样做时会产生更多的垃圾)不再需要那个对象了)。

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

因为已经为您创建了 BigDecimal.ZERO,并且 BigDecimal 之间的比较是按值进行的,所以尽量减少您使用的值的数量以使您的程序产生更少的垃圾是有意义的。这就是鼓励您使用 BigDecimal.ZERO 的原因。

【讨论】:

  • 一开始我打算使用BigDecimal.ZERO;,我只是想了解操作上的 cmets 中的所有来回。谢谢你的回复。我会检查它,但我首先看到了另一个。 +1 表示友善 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2018-10-07
相关资源
最近更新 更多