質問
JavaのStringクラスのように、不変のクラスを構築するための効率的な方法を探しています。
解決
- すべてのフィールドは
private
、できればfinal
- クラスが オーバーライド-クラスをファイナルにし、 または静的な工場を使用して コンストラクタープライベート
- フィールドは コンストラクター/ファクトリー
- セッターを提供しないでください フィールド
- コレクションに注意してください。つかいます
Collections.unmodifiable *
。また、コレクションには不変オブジェクトのみを含める必要があります - すべてのゲッターが提供する必要がある 不変オブジェクトまたはディフェンシブコピー を使用する
- 次のようなメソッドを提供しないでください の内部状態を変更する オブジェクト。
Tom Hawtin は、 final
はオプションにできることを指摘しました。 String
class
には、ハッシュ関数が呼び出されたときにのみ割り当てられるキャッシュ hash
変数があります。
他のヒント
コンストラクタを使用してすべてのフィールドにデータを入力し、フィールドを最終的にする場合-途中です。
フィールドでカスタムタイプを使用する場合-それらを不変にする必要がある場合があります。
コレクションであるすべてのフィールドは、変更できないコレクションを使用する必要があります-安全のために。
オブジェクトグラフについて心配する必要があります!
オブジェクトのすべてのメソッドは、最終ではないフィールドに注意する必要があります。例えば。 String.addは new 文字列を作成します。 1つのフィールドを変更する必要がある場合-コピーコンストラクターを使用して変更します。
最後にオブジェクトを最終的にします。
所属していません StackOverflow