[Java] Immutable Object


ソース

Immutable Object


  • オブジェクト向けプログラミングでは、不変オブジェクト(immutable object)とは、生成後にその状態を変更できないオブジェクトを指す.

  • 代わりに、可変オブジェクトとして作成した後にステータスを変更できます.

  • C++でconstデータメンバーを使用するなど、一部のプロパティは変更されません.また、場合によっては、内部で使用される属性が変化し、外部で使用されるオブジェクトの状態が変化しない場合は、不変オブジェクトとみなされます.
    たとえば、「コメント」(Memoization)キャッシュを使用してコストの高い計算結果をキャッシュしても、オブジェクトは変わらないと考えられます.不変オブジェクトの初期状態は通常、作成時に決定されますが、オブジェクトが実際に使用されるまで遅延します.

  • 不変のオブジェクトを使用すると、レプリケーションまたは比較操作が簡略化され、パフォーマンスの向上に役立ちます.ただし、オブジェクトに変更可能なデータが多数ある場合は、変更せずに不適切になる場合があります.したがって、多くのプログラミング言語では、不変または可変のいずれかを選択できます.
  • 💨 つまり、不変のオブジェクトを再割り当てできますが、いったん割り当てると内部データは変更できません.

  • オブジェクトに値を割り当てると、内部データは変更できません.

  • 典型的な例としては、String、Integer、Booleanが挙げられる.

  • StringはString str="a", str="ab"なので、値を可変オブジェクトと見なすのは簡単です.
  • しかし、これはstrが「b」という新しいオブジェクトを作成し、strに最初に参照した「a」値を「b」に変更するのではなく、そのオブジェクトを参照させることを意味する.

  • <非不変クラス>

    
    
    class MutablePerson {
       public int age;
       public int name;
        
       public MutablePerson(int age, int name) {
        	this.age = age;
            this.name = name;
        }
    }
    
    
  • 外部で年齢または名称を変更できる
  • <不変クラス>

    
    class ImmutablePerson {
        private final int age;
        private final int name;
        
        public ImmutablePerson(int age, int name) {
        	this.age = age;
            this.name = name;
        }
    }
    
    

  • 上記のように、外部で値を変更することはできません
    これは
  • final変数で、もちろんSetterメソッドを作成することはできません.
  • 可変オブジェクトのメリットとデメリット


  • 長所

  • オブジェクトへの信頼性が向上しました.
  • オブジェクトが作成され、変更されない場合は、トランザクションで変更されないため、安心して使用できます.

  • 作成者は、アクセスメソッドの防御をコピーする必要はありません.

  • 同期処理を必要とせずに、マルチスレッド環境でオブジェクトを共有できます.

  • 短所

  • オブジェクトが持つ各値には、新しいオブジェクトが必要です.
  • では、メモリが漏洩し、新しいオブジェクトの作成を続行する必要があるため、パフォーマンスが低下する可能性があります.