web-dev-qa-db-ja.com

BigDecimal.ZEROと新しいBigDecimal(0)。使用するものとその理由

これら2つが同じかどうか疑問に思っていました。誰でも確認できますか? (私は1番目を2番目に置き換えようとしています)

_BigDecimal totalCurrentSales = new BigDecimal(0);
_

そして

_BigDecimal totalCurrentSales = BigDecimal.ZERO;
_

私が尋ねる理由は、既存のBigIntegerBigDecimal (ZERO, ONE, TEN)のインスタンスを作成することになっていないため、最初の方法で宣言することは不適切だからです。だから、私はそれを2番目の方法で言うことができるかどうか疑問に思っていましたが、それはまだインスタンスの作成と見なされます。変数zeroまたは_BigDecimal.ZERO_と等しいものを作成する代わりに。または、他の方法はありますか?

私は試した

_BigDecimal totalCurrentSales = new BigDecimal(BigDecimal.ZERO);
_

しかし、Eclipseはあまり幸せではありませんでした。

23
erp

数学的には、それらは同じです。さらに、BigDecimalsは不変であるため、新しいインスタンスを作成して新しい計算を行うことを心配する必要はありません。 totalCurrentSalesインスタンスで何らかの操作を実行するとすぐに、実際には新しいBigDecimalを作成し、totalCurrentSales参照を新しい値に再割り当てします。

インスタンス化の観点から見ると、それらは必ずしも同じではありません。たとえば、OpenJDK 6b14実装では、BigDecimal.ZEROBigInteger.ZERO、および0の値でプライベートnew BigDecimal(BigInteger, long, int)コンストラクターを呼び出すことにより、0が作成されます。

コード品質の観点から、余分なインスタンス化を回避し、コードにリテラルを含めるため、new BigDecimal(0)よりもBigDecimal.ZEROを使用することをお勧めします。

32
bdkosher

BigDecimalには、引数としてBigDecimalを受け取るコンストラクターがないため、Eclipseがこれに満足しない理由を説明しています。

BigDecimalは不変です。つまり、一度オブジェクトを作成すると、その状態は変化しません。

また、参照を比較するObjectのデフォルトの実装とは対照的に、BigDecimalのequalsメソッドとhashcodeメソッドはオーバーライドされて値渡しになります。そのため、BigDecimal.ZEROとnew BigDecimal( "0")の使用方法の観点から違いはありません。ただし、新しいインスタンスを作成すると、JVMの作業が増えます(そうしないとゴミが増えます)。そのオブジェクトはもう必要ありません)。

BigDecimalは不変で値ベースであるため、使用される特定の参照はBigDecimalを使用するコードには関係ありません。

BigDecimal.ZEROはすでに作成されており、BigDecimals間の比較は値によるものであるため、使用する値の数を最小限に抑えて、プログラムで発生するごみが少なくなるようにします。そのため、BigDecimal.ZEROを使用することが奨励されています。

7
Nathan Hughes