6

私は不変性の概念を学んでいます。

オブジェクトが作成されると、不変オブジェクトはその値を変更できないことを理解しています。

しかし、次の不変オブジェクトの使用法がわかりませんでした。

彼らです

  • 自動的にスレッドセーフであり、同期の問題はありません。How ? Proof ?
  • コピー コンストラクターは必要ありません。How ? Any example ?
  • クローンの実装は必要ありませんHow ? Any example ?
  • フィールドとして使用する場合、防御的にコピーする必要はありませんHow ? Any example ?
  • always have "failure atomicity" (a term used by Joshua Bloch): 不変オブジェクトが例外をスローした場合、望ましくない状態や不確定な状態になることはありません。How ? Any example ?

誰かがそれをサポートする例を挙げて、これらの各点を詳細に説明してもらえますか?

ありがとう。

4

4 に答える 4

1

これは、例を挙げて説明できる概念ではありません。不変オブジェクトの利点は、データが変更できないことがわかっているため、それについて心配する必要がないことです。不変オブジェクトを渡すメソッドによって変更されることを恐れずに、不変オブジェクトを自由に使用できます。

スレッドによって変更されたデータに基づくバグは実行されるべきではないため、マルチスレッドプログラムを実行している場合、これは便利です

于 2013-07-18T08:42:41.563 に答える
0

自動的にスレッドセーフ

  • それらは変更できない(変更できない)ため、それにアクセスするスレッドは同じ状態のオブジェクトを見つけます。したがって、1 つのスレッドがオブジェクトの状態を変更し、次に 2 番目のスレッドが引き継ぎ、オブジェクトの状態を変更し、最初のスレッドが手がかりなしに引き継ぎ、他の誰かによって変更されたというような状況はありません。
  • 良い例は ArrayList です。1 つのスレッドがその要素を反復処理し、2 番目のスレッドがその要素の一部を削除すると、最初のスレッドはある種の同時実行例外をスローします。不変リストを使用すると、これが防止されます

コンストラクターのコピー

  • コピー コンストラクターを持てないという意味ではありません。これは、同じ型のオブジェクトを渡すコンストラクターであり、指定されたオブジェクトのコピーとして新しいオブジェクトを作成します。あくまで推測ですが、なぜ常に同じ状態のオブジェクトをコピーするのでしょうか?
public class A
{
    private int a;

    public A(int a)
    {
        this.a = a;
    }

    public A(A original)
    {
        this.a = original.a;
    }

}  

クローンの実装

  • 常に同じ状態にある同じ問題、オブジェクトのクローン作成は、通常、メモリ内のスペースのみを占有します。しかし、不変オブジェクトから可変オブジェクトを作成したい場合は、それを行うことができます
  • 良い例は再びコレクションです。不変のコレクションから可変のコレクションを生成できます。

防御的コピー

  • 防御コピーとは、オブジェクトをフィールドに設定するときに、元のコピーである同じタイプの新しいオブジェクトを作成することを意味します
于 2013-07-18T08:47:20.157 に答える