なぜJavaのBigDecimalになぜZEROやONEなどの定数があるのか?

公開日:2019-01-14
最終更新:2019-01-14

Java以外にも.NETも実装されている以下の定数について、なぜ定数が用意されているかを調べた際のメモ。

Java:BigDecimal.ZERO / BigDecimal.ONE / BigDecimal.TEN   
.NET:Decimal.Zero    / Decimal.One    / Decimal.MinusOne

結論

調べましたが、これといった明確な答えは見つかりませんでした。

ネットの見解

まず、sstackoverflowで一番評価が高かった投稿について。

Why does Java’s BigInteger have TEN and ONE as constants? Any Practical use?
https://stackoverflow.com/questions/17544151/why-does-javas-biginteger-have-ten-and-one-as-constants-any-practical-use

こちらの回答を要約すると、「使用頻度が多いから」となっており、
具体的な意見として、 BigInteger.valueOf(10) よりも可読性が高いから、
パフォーマンス(インスタンス生成時の実行時間、消費メモリ)が良いから、
ぐらいの内容しか議論されておらず、これ以上の回答はないようです。

個人的には世のJavaコードの可読性を上げるために使用頻度の高い数値だけ定数化したのではないかと思ってます。

逆に定数で導入していない言語の状況

RubyのBigDecimalに対し定数、ZERO、ONE、TENを導入してはどうか?という提案を発見しましたが、
今のところ保留扱いにされていました。(保留の理由は不明。優先度が低いから?)

https://bugs.ruby-lang.org/issues/10782#change-52557

コミュニティの好みとか文化の違い?

補足:new BigDecimal(“10”)とnew BigDecimal(10)の違い

特に違いはないですが、BigDecimal内部で持っているprecision(精度)という値がintで初期化すると
常に0が入るみたいです。

ただ、その後の演算(例えば、devideなど)に影響しないようなので、
コーディングの際には気にする必要もないのかと思ってます。(FindBugsやSonarQubeでもそういったルールはない)

強いて違いを上げるとすれば、Long.MAX_VALUE を超える値を生成する場合はStringでの初期化一択になり、
1048576のような大きい数を初期化する場合はnew BigDecimal(1_048_576)のように書けるくらい?

記事が少しでもいいなと思ったらクラップを送ってみよう!
3
+1
勉強したことのメモ

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする