質問

JavaのStringクラスのように、不変のクラスを構築するための効率的な方法を探しています。

役に立ちましたか?

解決

  1. すべてのフィールドは private 、できれば final
  2. クラスが オーバーライド-クラスをファイナルにし、 または静的な工場を使用して コンストラクタープライベート
  3. フィールドは コンストラクター/ファクトリー
  4. セッターを提供しないでください フィールド
  5. コレクションに注意してください。つかいます Collections.unmodifiable * 。また、コレクションには不変オブジェクトのみを含める必要があります
  6. すべてのゲッターが提供する必要がある 不変オブジェクトまたはディフェンシブコピー
  7. を使用する
  8. 次のようなメソッドを提供しないでください の内部状態を変更する オブジェクト。

Tom Hawtin は、 final はオプションにできることを指摘しました。 String class には、ハッシュ関数が呼び出されたときにのみ割り当てられるキャッシュ hash 変数があります。

他のヒント

コンストラクタを使用してすべてのフィールドにデータを入力し、フィールドを最終的にする場合-途中です。

フィールドでカスタムタイプを使用する場合-それらを不変にする必要がある場合があります。

コレクションであるすべてのフィールドは、変更できないコレクションを使用する必要があります-安全のために。

オブジェクトグラフについて心配する必要があります!

オブジェクトのすべてのメソッドは、最終ではないフィールドに注意する必要があります。例えば。 String.addは new 文字列を作成します。 1つのフィールドを変更する必要がある場合-コピーコンストラクターを使用して変更します。

最後にオブジェクトを最終的にします。

どのフィールドも変更できない場合、オブジェクトは不変であるため、それらのフィールドは final でなければなりません。オブジェクトをサブクラス化したくない場合は、Stringのように、クラス自体を final にすることもできます。 多くの情報を含む不変オブジェクトを簡単に構築するには、ファクトリパターン

詳細については、ウィキペディア

をご覧ください。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top