なぜ不変オブジェクトを使用するのか、および不変オブジェクトを作成する方法


不変オブジェクトは
これは、オブジェクトを作成した後も、オブジェクト内部の状態が変わらないことを意味します.オブジェクトの内部状態を提供する方法が提供されていないか、提供されていない場合は、防御的なレプリケーションによって提供されます.
浅い、深い、放射線を防ぐ

  • 浅い放射
    オブジェクトをコピーする場合は、オブジェクトのみをコピーして新しいオブジェクトを作成します.コピーされたオブジェクトのインスタンス変数は、元のオブジェクトのインスタンス変数と同じメモリアドレスを参照します.したがって、コピーされたオブジェクトの値が変化すると、元のオブジェクトの値も変化します.

  • ふかほうしゃ
    オブジェクトをコピーすると、元のメモリアドレスは参照されません.コピーされたオブジェクトとインスタンス変数が新しいアドレスにコピーされるためです.
    1)レプリケーション作成者またはレプリケーションファクトリディレクトリによるレプリケーション
    2)オブジェクトを直接作成してコピーする
    3)クローンを再定義するためのCloneableの実装()
    ->クローン()が最終インスタンスまたは配列でない場合は、再定義は推奨されません.
    (可変オブジェクトがコピーされている場合は、クローンオブジェクトの要素を空にすることができます).

  • ぼうごせいふくしゃ
    作成者パラメータとして受信したオブジェクトのコピーを作成し、内部フィールドを初期化したり、getterメソッドから内部オブジェクトを返したりするときにオブジェクトのコピーを作成して返します.外部でオブジェクトを変更しても、内部オブジェクトは変更されません.
  • public class User {
        private final UserInfo age;
    
        public User(UserInfo age) {
            this.age = age;
        }
    
        public UserInfo getAge() { return age; }
    }
    
    // 생성자에 방어적 복사 적용
    public User(UserInfo age) {
        this.age = new UserInfo(age.getAge());
    }
    
    // getter 메서드에 방어적 복사 적용
    public UserInfo getAge() {
        return new UserInfo(age.getAge());
    }
    
    なぜ「不変オブジェクト」(Immutable Object)を使用するのか
    1)Thread-Safeは、同期を考慮することなく並列プログラミングに使用できる.
    共有リソースは変わらないので、常に同じ値を返します.
    2)失敗した原子メソッドを作成できます.
    どのような例外が発生しても、メソッド呼び出し前の状態を維持できます.これにより、例外が発生する前に次の論理を同じ状態で処理できます.
    3)キャッシュ,Map,Set要素としての使用に適している.
    オブジェクトがキャッシュまたはMapまたはSetに変更された場合、リフレッシュ操作は必要ありません.
    4)付随する効果を避けるために,エラーを最小化することができる.
    *乗数効果:変数の値の変更、オブジェクトのフィールド値の設定、例外またはエラーによる実行の中断
    5)メソッド呼び出し時にパラメータ値が変わらないことを保証できる.
    6)ゴミ収集性能を向上させることができる.
    ゴミ収集機でスキャンするオブジェクトの数が減少するため、スキャンするメモリ領域やスキャンにかかる時間が減少し、GC実行時の遅延も減少します.
    不変オブジェクトの作成方法
    1)クラスをfinalとして宣言
    2)すべてのクラス変数をfinal、privateとして宣言
    3)オブジェクト作成用のジェネレータまたはスタティックファクトリメソッドの追加
    *スタティックファクトリメソッド:作成者から直接オブジェクトを作成するのではなく、メソッドを使用します.
    4)参照が変更可能であれば、コピー転送を防御する
    *参考資料
    https://mangkyu.tistory.com/131
    https://velog.io/@miot2j/%EC%96%95%EC%9D%80%EB%B3%B5%EC%82%AC-%EA%B9%8A%EC%9D%80%EB%B3%B5%EC%82%AC-%EB%B0%A9%EC%96%B4%EC%A0%81-%EB%B3%B5%EC%82%AC%EB%9E%80
    https://jackjeong.tistory.com/100