JavaのStringクラスと同様に、不変クラスを構築するための効率的な方法を探しています。オブジェクトを不変にする方法がありません
答えて
- すべてのフィールドは
private
ことができ、好ましくはfinal
- クラスは をオーバーライドすることはできませんことを確認しなければならない - プライベート
- たフィールドから移入されなければならない、クラスの決勝を行い または静的ファクトリを使用して コンストラクタを保ちます コンストラクター/ファクトリー
- フィールドにはセッターを指定しないでください。
- コレクションに気を付ける。
Collections.unmodifiable*
を使用してください。また、コレクションはすべてゲッターが 不変オブジェクトを提供したり、 オブジェクトの内部状態を変更 任意のメソッドを提供しないでくださいdefensive copying - を使用しなければならない唯一の不変オブジェクト
- が含まれている必要があります。
Tom Hawtinfinal
は任意であることが指摘されている。 String
class
には、キャッシュhash
があります。これは、ハッシュ関数が呼び出されたときにのみ割り当てられます。
Sun String実装にはfinalではないインスタンスフィールドがあります。 –
良い点。 「最終的な」要件ではありません。 Stringのハッシュvarは完全な例です。 –
派生クラスが保護されたフィールドを公開していないことを確実にするためにfinalをmakeにすることも考えてください。 –
を参照してください、詳細についてはFactory Pattern
をご覧くださいそこ。
フィールドにカスタムタイプが使用されている場合は、それらも変更不可能にする必要があります。
コレクションであるフィールドはすべて、変更不可能なコレクションを使用する必要があります。安全な側にする必要があります。
オブジェクトグラフについて心配する必要があります。
オブジェクト上の任意のメソッドは、最終的でないフィールドに注意する必要があります。例えば。 String.addは新しい文字列を作成します。 1つのフィールドを変更する必要がある場合は、コピーコンストラクタを使用します。
最後にオブジェクトを最終的にします。
例の助けを借りてこれを説明できるかどうか本当に感謝します。 –
まだコピーをお持ちでない場合は、Josh BlochのEffective Javaのコピーを入手してください。彼は私が今まで以上にこれを説明する! – Fortyrunner
確かに、それは今日それ自体を行うでしょう。ありがとう –
- 1. タイプエラー:オブジェクトに分割方法がありません
- 2. TokuMXオブジェクト[オブジェクトのオブジェクト]は方法はありません「のhasNext」
- 3. ローカルブランチを不変にする方法はありますか?
- 4. ディスパッチ後にオブジェクトが変わることはありません
- 5. WADLにオブジェクトがありません
- 6. 角オブジェクトに$$ハッシュキーがありません
- 7. 'datetime.datetime'オブジェクトにサブスクリプトがありません
- 8. 'classobj'オブジェクトにサブスクリプトがありません
- 9. nullオブジェクトにメソッドがありません[] =
- 10. オブジェクトにメソッド 'replace'がありません
- 11. オブジェクトにはエラーがありません
- 12. 'NoneType'オブジェクトにサブスクリプトがありません
- 13. CNTK + Keras:AttributeError: '変数'オブジェクトに 'get_shape'属性がありません
- 14. 私は 'AttributeError:' int 'オブジェクトに属性' isdecimal 'がありません。修正方法がわかりません
- 15. 最終的な不変オブジェクトは定数ではありませんか?
- 16. Ruby - 方法がありませんか?
- 17. TypeErrorオブジェクト[オブジェクトオブジェクト]にメソッドがありませんSubSelf、TypeErrorオブジェクト[オブジェクトオブジェクト]にメソッドがありませんintersectsPlane
- 18. Sonarqube6.7 '不明なファイルをインポートする'オプションがありません
- 19. ドロワーナビゲーターに表示させる方法がありません
- 20. 上にスクロールする方法はありますが、瞬時にスクロールする方法はありませんか?
- 21. VBA「引数はオプションではありません」 - 変数を宣言する方法がわかりません
- 22. itext 5.1オブジェクトがありません
- 23. fetch()でJSONオブジェクトがありません
- 24. オブジェクトのインテリセンスがありません
- 25. Rubyのオブジェクトがありません
- 26. スクリプトタグに変数がありません
- 27. なぜJSONにオブジェクトを変換する必要はありませんん@XmlRootElement
- 28. Emberオブジェクトをプレーンなjavascriptオブジェクトに変換する方法はありますか?
- 29. XML :: TwigオブジェクトをXML :: XPathオブジェクトに変換する方法はありますか?
- 30. Elmの多分値をアンラップする方法があまりありません
文字列のようなクラスを探していますか?私は最初にあなたの質問を読んでいませんでしたが、もしあなたがそうしたら、私はいくつかのString固有の例で私の答えを変えます。 – Jorn
文字列はJavaの特別な市民です。まさにプリミティブ型ではありませんが、クラスとはみなされません。 Stringは、+演算子をオーバーロードする唯一の "クラス"です。 2つのストリングを追加すると、新しいストリングになります。演算子のオーバーロードは通常のクラスでは許可されません。 – kgiannakakis
文字列をクラスと見なすことはできませんか? –