2

私は、Java の不変性が望ましい機能であると書かれている多くの場所を読みました。これはなぜですか?

4

5 に答える 5

5

不変性により、オブジェクトのライフサイクルについて推論しやすくなります。スレッド間での共有が簡単になるため、マルチスレッドプログラムで特に役立ちます。

一部のデータ構造は、キーまたは要素が不変であるか、重要な方法で変更されていないことを前提としています。例:マップとセット。それらは厳密に不変である必要はありませんが、不変である場合ははるかに簡単になります。

不変オブジェクトの欠点は、オブジェクトのリサイクルが非常に難しくなり、パフォーマンスに大きな影響を与える可能性があることです。

つまり、パフォーマンスが問題になる場合は、可能な限り不変オブジェクトを使用しない場合は、可変オブジェクトを検討してください。

于 2013-03-10T03:12:47.777 に答える
3

不変性の主な利点は、オブジェクトを「あなたの下から」変更できないことです。たとえば、Map のキーである String を考えてみましょう。変更可能な場合は、キーと値のペアを挿入してから、キーである文字列を変更できます。これにより、マップで使用されているハッシュ スキームが壊れ、非常に予測不可能な操作が発生する可能性があります。

場合によっては、このような可変性が意図的な悪用によりセキュリティの危険にさらされる可能性がありますが、より一般的には、単に不可解なバグにつながるだけです。そして、(このようなバグを回避するための) 可変オブジェクトの「防御的な」コピーは、さらに多くのオブジェクトが作成されることにつながります (特に、問題に対して定型的なアプローチが取られる場合)。

(一方で、多くのオブジェクトが作成されます。たとえば、誰かが文字列に追加したり、その一部を「切り取ったり」したときに新しい文字列が作成されたり、既存の文字列を単純に変更したりするため、両方のアプローチが原因になります。さまざまな理由で、より多くのオブジェクトが作成されます。)

于 2013-03-10T03:21:44.717 に答える
2

予期しないときにクラスが変更されていないことを知る必要がある場合は、不変性が非常に望まれます。ハッシュマップのキーについて考えてみましょう。キーに可変オブジェクトを設定し、それをキーの現在のハッシュ値(modハッシュ配列サイズ)で保存すると、変更するとどうなりますか?ハッシュが変更され、突然間違った場所に配置されます。あなた(HashMap)はそれが変更されたことを知らないので、その場所を更新することを知らないので、次に誰かがそのキーを検索しようとしたときに、あなたはそれを見つけることができません。不変性はこの問題を取り除きます-そのハッシュに基づいてオブジェクトをどこかに置くと、それは常にあなたが期待する場所にあることがわかります。

また、他の場所で指摘されているように、不変であるということは、同期せずに複数のスレッドから同時に読み取ることが安全であることを意味します。

于 2013-03-10T03:14:02.797 に答える
1

プログラミングでは、不変クラスまたはオブジェクトは、作成後に状態を変更できないオブジェクトです。属性 (フィールド) を変更できても不変と見なされる場合がありますが、オブジェクトの性質は変わりません。

多くの場合、不変オブジェクトが望まれます。主な理由は次の 3 つです。

  1. スレッドセーフ
  2. 可変オブジェクトよりも高いセキュリティ
  3. シンプルさ

refがあります。Java クラスとオブジェクトの不変性について理解を深めるために確認できます。

于 2013-03-10T03:31:20.850 に答える
0

効果的な Java 項目 15不変クラスは、可変クラスよりも設計、実装、および使用が容易です。エラーが発生しにくく、より安全です。

于 2013-03-10T03:18:06.933 に答える