Java BigDecimal.ZERO与新的BigDecimal(0)。使用哪一个以及为什么?
我想知道这两者是否相同。有人能证实吗?(我正在尝试用第二个替换第1个) 及 我询问的原因是,以第一种方式声明它是不合适的,因为您不应该创建已经存在的Java BigDecimal.ZERO与新的BigDecimal(0)。使用哪一个以及为什么?,java,bigdecimal,Java,Bigdecimal,我想知道这两者是否相同。有人能证实吗?(我正在尝试用第二个替换第1个) 及 我询问的原因是,以第一种方式声明它是不合适的,因为您不应该创建已经存在的biginger和BigDecimal(零,一,十)的实例。所以我想知道我是否可以用第二种方式来表达,并且仍然可以考虑创建一个实例。而不是我必须创建一个变量zero或等于BigDecimal.zero。或者还有其他方法吗 我试过了 BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZER
biginger
和BigDecimal(零,一,十)
的实例。所以我想知道我是否可以用第二种方式来表达,并且仍然可以考虑创建一个实例。而不是我必须创建一个变量zero
或等于BigDecimal.zero
。或者还有其他方法吗
我试过了
BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);
但是eclipse并不太高兴。BigDecimal没有一个构造函数将BigDecimal作为参数,所以这就解释了为什么eclipse不喜欢它 BigDecimal是不可变的,这意味着一旦您创建了一个对象,它的状态就永远不会改变 此外,BigDecimal的equals和hashcode方法被重写为按值执行,这与对象的默认实现相反,后者比较引用。因此,从使用方式的角度来看,BigDecimal.ZERO和new BigDecimal(“0”)之间没有什么区别,只是创建一个新实例对JVM来说需要更多的工作(当您不再需要该对象时,会产生更多的垃圾) BigDecimal是不可变的,并且基于值,这意味着所使用的特定引用对于使用BigDecimal的代码来说并不重要
因为已经为您创建了BigDecimal.ZERO,并且BigDecimal之间的比较是按值进行的,所以尽可能减少您使用的值的数量是有意义的,这样您的程序会创建更少的垃圾。这就是为什么鼓励您使用BigDecimal.ZERO。在数学上,它们是相同的。另外,由于大小数是不可变的,您不需要担心创建新实例来进行新计算。只要对
totalCurrentSales
实例执行一些操作,实际上您将创建一个新的BigDecimal,并将totalCurrentSales
引用重新指定给新值
从实例化的角度来看,它们不一定完全相同。例如,在OpenJDK 6b14实现中,
BigDecimal.ZERO
是通过调用私有的新的BigDecimal(biginger,long,int)
构造函数来创建的,该构造函数的值为biginger.ZERO
,0
和0
从代码质量的角度来看,使用
BigDecimal.ZERO
比使用新的BigDecimal(0)
更可取,因为您可以避免额外的实例化并在代码中包含一个文本。如果您真正理解这些概念,那么您可能已经知道解决方案:使用后者BigDecimal totalCurrentSales=BigDecimal.ZERO
BigDecimal.ZERO
不是新实例。它是对现有实例的引用。为什么需要新实例@Dasky已经澄清了BigDecimal
是不可变的。那么我最初说的是正确的吗<代码>BigDecimal totalCurrentSales=BigDecimal.ZERO你说既然它是不可变的,就没有必要说new
?@erp,你不必在这里创建一个新实例,因为已经有一个(BigDecimal.ZERO)。BigDecimal.ZERO永远不会改变。它的值必须始终为0。你所说的最后一部分确实是我一直在寻找的。这里的仇恨已经超出了图表。谢谢你的回复。一个清晰简洁的回答+1使用不同的构造函数会导致BigDecimal.ZERO
被“膨胀”,而新的BigDecimal(0)
在内部使用数字的紧凑表示。这可能会影响性能。我只需要知道解决方案,因为它出现在声纳错误中。我知道在性能方面它可以忽略不计,但我只是想让它处于首选状态,因为这就是sonar的首要用途代码>首先,我只是想理解作品评论中的所有来来回回的内容。谢谢你的回复。我本想检查一下,但我先看到了另一个+1.谢谢你的好意(tho:)
BigDecimal totalCurrentSales = BigDecimal.ZERO;
BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);