カプセル化されたコレクション
2004年8月3日
オブジェクト指向設計について学ぶと、すぐにデータをカプセル化することが重要であるとわかります。カプセル化の最も簡単な形式は、アクセサ(ゲッターとセッターメソッド)またはプロパティを使用することです。言語によってはサポートされているものもあります。(クラス内で行うものもあります - 自己カプセル化
getとsetの慣習は単一値には機能しますが、複数値フィールド(値のコレクションであるフィールド)にはうまく機能しません。この場合、別のアクセサスキームが必要です。これの重要な点は、クライアントにコレクションのデータ構造自体への直接アクセスを許可したくないことです。許可してしまうと、クライアントはサプライヤの介入なしにサプライヤのデータを変更できます。カプセル化のポイントは、オブジェクトがそのデータへのアクセスを制御することです。
コレクションフィールドを変更するには、通常、コレクションに要素を追加したり、コレクションから要素を削除したりするための特定のメソッドがあります。たとえば、従業員のコレクションを持つCompanyクラスがある場合、addEmployee
とremoveEmployee
メソッドが期待できます。コレクションを取得するsetEmployees
メソッドが表示される場合もありますが、通常は追加メソッドと削除メソッドを使用する方が簡単です。
通常、最も厄介なのは取得する側です。オブジェクトを格納するために使用される実際のコレクションを返したくありません。そうしないと、人々はカプセル化する追加メソッドと削除メソッドを使用せずにアイテムを追加および削除できます。それでは何を返すのでしょうか?最良のオプションは、基盤となるコレクションの読み取り専用ビューです。Javaのコレクションライブラリは、変更不可能なコレクションラッパーによってこれを容易にします。もう 1 つのオプションとして、基盤となるコレクションを更新できないイテレータを使用できる場合があります(使用できる場合)。
これらのどちらかが利用できない場合、通常の対応策は基盤となるコレクションのコピーを返すことです。これにより、クライアントがコピーを変更しても、実際のコレクションには影響しません。コレクションのコピーには少し時間のオーバーヘッドがありますが、これは単なるオブジェクト参照の束なのでほとんど重要ではありません。