不変クラスを作成するにはどうすればいいですか? 質問する

不変クラスを作成するにはどうすればいいですか? 質問する

不変クラスの作成に取り組んでいます。
すべてのプロパティを読み取り専用としてマークしました。

クラス内にアイテムのリストがあります。
プロパティが読み取り専用の場合、リストは変更できます。

リストの IEnumerable を公開すると、リストは不変になります。
クラスを不変にするために従わなければならない基本的なルールは何かを知りたいです。

ベストアンサー1

あなたは正しい方向に進んでいると思います -

  • クラスに注入されるすべての情報はコンストラクタで提供される必要があります
  • すべてのプロパティはゲッターのみである必要があります
  • コレクション(または配列)がコンストラクタに渡される場合、呼び出し元が後で変更できないようにコピーする必要があります。
  • コレクションを返却する場合は、コピーまたは読み取り専用バージョン(たとえば、ArrayList.読み取り専用または同様のことを前のポイントと組み合わせて呼び出し側がアクセスしたときに返される読み取り専用コピー)、列挙子を返す、またはコレクションへの読み取り専用アクセスを許可する他のメソッド/プロパティを使用する
  • メンバーのいずれかが可変である場合、依然として可変クラスのように見える可能性があることに留意してください。この場合、保持したい状態をすべてコピーし、呼び出し元に返す前にコピーしない限り、可変オブジェクト全体を返さないようにしてください。別のオプションは、可変オブジェクトの不変の「セクション」のみを返すことです。この点を拡張するように勧めてくれた @Brian Rasmussen に感謝します。

おすすめ記事