2015-10-19 6 views
6

Javaでは、BigIntegerは不変ですが、多くの時間をかけて多くの計算を実行して多くのオブジェクトを生成することができるため、理由を理解したいと思います。それで、それは不変にしないように直感的な感じです。私の心に来る状況は、文字列操作のようなもので、次にStringBuilderのオプションです。 BigIntegerの不変でない対応があるでしょうか?私はそれが多くの状況で有益かもしれないと思う。なぜJavaのBigIntegerは不変であるように設計されていますか?

編集:私は、不変性の利点と、多くの場合それがどのように有益であるかを知っています。 BigIntegerの利点を理解したかっただけです。 BigIntegerを使って大きな数の階乗を計算しました。だから、私は変更可能なBigIntegerを好むでしょう。同様に、BigIntegerは結果がintよりもはるかに大きい計算に使用されます。それ以外の場合はBigDecimalがあります。ジョシュ・ブロッホ

+0

変更可能な 'BigInteger'として(並べ替え)として' BitSet'を使うことができます。 –

+1

短命オブジェクトは安価であり、不変オブジェクトには多くの利点があります。 – chrylis

+0

* "多くの状況で有益かもしれないと思う" * ...実際にはスーパーパフォーマンスの重要な状況では重要なことかもしれないが、想定しているように全体的に多くの状況ではないかもしれない。しかし、プロファイリングで証明されたパフォーマンス重視のコードブロックが実際にあれば、変更可能なコンパニオンクラスが答えになります。 – scottb

答えて

11

Effective Javaは「:可変性を最小限に抑える項目15」:で、不変クラスの利点を説明

不変クラス は、設計、実装、および 可変クラスよりも使いやすいです。彼らは エラーが発生しやすく、より安全です。オブジェクトが一つだけの状態で存在することができるので

不変オブジェクトは、シンプルある - 。それが作成された状態を簡単なコードが少ないバグを持っている傾向があります。オブジェクトは変更できないため、スレッドセーフ外部同期なしです。

ブロッホは、例としてBigIntegerを使用して、不変クラスとパフォーマンスの問題に対処:

不変クラスの唯一の本当の欠点は、各個別の値の 別のオブジェクトを必要とすることです。これらのオブジェクトを作成すると、特に大きい場合は が高価になります。 [...]

内部的には、不変クラスは任意に巧妙にすることができます。たとえば、BigIntegerには、モジュールのべき乗などの多段階操作を高速化するために使用する、パッケージ固有の可変コンパニオンクラスがあります。 BigIntegerを使用するよりも、前述の理由からmutableコンパニオンクラスを使用する方がはるかに難しいですが、幸運にもBigIntegerの実装者が苦労しました。

内部的には、BigIntegerはすでに最適化を行っています。あなたが本当に変更可能なBigIntegerを望むのであれば、BitSetを使うことができますが、これはおそらくあなたのコードをより複雑にし、エラーを起こしやすくすることに注意してください。変更可能なバージョンを使用すると、パフォーマンスが大幅に向上すると確信している場合を除き、可能な限り最も簡単な解決策(BigInteger)を使用する必要があります(同じ書籍の「項目55:賢明に最適化する」も参照してください)。

関連する問題