我想知道这两个是否相同.谁能验证?(我试图用第二个替换第一个)
BigDecimal totalCurrentSales = new BigDecimal(0);
Run Code Online (Sandbox Code Playgroud)
和
BigDecimal totalCurrentSales = BigDecimal.ZERO;
Run Code Online (Sandbox Code Playgroud)
我想问的原因是,它是不恰当的,第一种方式宣告它,因为你不应该创建已有的实例BigInteger和BigDecimal (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,0和0.
从代码质量的角度来看,使用BigDecimal.ZERO是优选的,new BigDecimal(0)因为您可以避免额外的实例化并在代码中使用文字.
BigDecimal没有将BigDecimal作为参数的构造函数,因此这解释了为什么Eclipse会对此不满意.
BigDecimal是不可变的,这意味着一旦你创建了一个对象,它的状态永远不会改变.
此外,BigDecimal的equals和hashcode方法被重写为value,而不是Object的默认实现,它比较了引用.因此,从使用它们的角度来看,BigDecimal.ZERO和新BigDecimal("0")之间没有区别,除了创建一个新实例对JVM来说更多的工作(并且当你没有时会产生更多的垃圾)不再需要那个对象了.
BigDecimal是不可变的和基于值的意味着使用特定的引用对使用BigDecimal的代码无关紧要.
因为BigDecimal.ZERO已经为您创建并且BigDecimals之间的比较是按值进行的,所以最小化您使用的值的数量是有意义的,这样您的程序可以减少垃圾.这就是为什么你被鼓励使用BigDecimal.ZERO.