オブジェクト可変性(mutability)
ほとんどの Cocoa オブジェクトは、変更可能(mutable)で、それらのカプセル化された値を変更できますが、一部は不変(immutable)であり、それらが作成された後、それらのカプセル化された値を変更することはできません。不変オブジェクトの主な利点は、それらを使用している間に、それらの値が変更しないという保証です。不変オブジェクトを一度作成すると、それが表す値は、実行中の期間を通じて同じままです。しかし、変更可能なオブジェクトのカプセル化された値はいつでも変更できます。値("セッター" アクセサメソッド) を置き換えるメソッドを介して、または段階的にそれらを変更するメソッドで、これを行えます。
オブジェクト可変性は、コレクションや、原始的データ型を表す Foundation フレームワークのクラスで特に重要です。これらのクラスは、例えば NSArray や NSMutableArray、または NSData や NSMutableData の、不変と可変のバリアントを持っています。変更可能なクラスは不変クラスのサブクラスであり、コレクションクラスの場合には、含まれている値が変更できる、表わされた値であるオブジェクトを生成します。
可変オブジェクトを受け取る
メソッドを呼び出し、戻り値のオブジェクトを受信したときに、メソッドの戻り値の型が不変であると特徴づけられていても、そのオブジェクトは変更可能である場合があります。不変オブジェクトを返すメソッドを宣言しても、その実装に変更可能なオブジェクトを返す事からクラスを防止するためのものは何もありません。受け取ったオブジェクトが実際に変更可能か不変かどうかを判断するために、イントロスペクション(内観)を使用できますが、するべきではありません。常に可変性を判断するオブジェクトの戻り値の型を使用して下さい。
メソッドから受け取った不変オブジェクトは、それについて知らなければ、可変になっていないことを確認したい場合は、ローカルにコピーして、オブジェクトのスナップショットを作成できます。
可変オブジェクトを格納
サブクラスを設計するとき、インスタンス変数が与えられたクラスの変更可能な、または不変のバリアントとして型指定するべきかどうかを普通決定しなければなりません。その内容が巨大に変更されるオブジェクトがある場合、一般的に、不変オブジェクトの使用をお勧めします。文字列(NSString) やデータオブジェクト(NSData) は、通常、このカテゴリーに分類されます。オブジェクトが増分的に変更される可能性がある場合、変更可能にする合理的なアプローチがあります。配列や辞書などのコレクションがこのカテゴリーに分類されます。ただし、変更の頻度とコレクションのサイズは、この決定要因となるでしょう。例えば、めったに変更されない小さな配列がある場合は、それを不変にすることをお勧めします。
前提条件の記事
関連記事
既出の議論
ココア基礎ガイドの オブジェクト可変性
次の章
前の章