コンストラクタ内でインスタンス変数を初期化する利点について説明してもらえます。オブジェクトが構築された後で同じことができ、それぞれのsettersメソッドを呼び出すことができます。コンストラクタ内の変数を初期化する利点
答えて
メンバ変数を初期化するために外部コードを使用する場合、論理的にはコンストラクタを使用するときと同じようにプログラムが正しい場合がありますが、オブジェクト指向設計全体が欠落しています。
OO開発者の目標は、コードを外部クラスにブラックボックスで表示される自己完結型クラスに分割することです。外部コードは、内部にどのような種類のメンバ変数があるかを知る必要はありません。あなたのクラスのパブリックインターフェイスに依存する必要があるのは、外部コードだけです。そして、あなたがSOLIDの原則に従うならば、あなたのクラスが最低限の数の関数も公開していることを確認するべきです。このようにして、コンシューマのためのきれいな抽象的なインタフェースを提供します。コード内は、必要なだけ複雑にすることができます。
クラスが非常に大きいので、複数のクラスに分割してデータ/関数を再構成し、全体的なデザインがよりよく流れるようにすることができます。データメンバを直接操作する外部コードがある場合は、イメージングを行います。
はい、setterで同じことをすることはできますが、必要なすべての変数を設定するまではクラスが矛盾します。さらに、setter呼び出し後に変数を変更できるのはsetterが公開されている場合です
コンストラクタで変数を取ることの利点は、オブジェクトが有効な値でのみ作成されることを保証できることです。
あなたは、コンストラクタの代わりに、同様の静的工場を検討することができます - Item 2 - Creating and Destroying Objects from effective java.
ナイーブセッター/ゲッターメソッドが本当にオブジェクト指向プログラミングの腐敗しているお読みください。何がOOのポイントですか?どのようにクラスが動作するかを知る必要があるクラス外のコードなしで彼らの主題が何であるかの複雑さを管理するクラスを作成する。
getter/setterを追加することで、実際にはメンバー変数を実際に公開することなく、クラスがどのように動作するかを基本的に公開しています。
便宜上、私たちはしばしばこれを行いますが、実際にはそれは最良のアイデアではありません。
車をモデル化して、オイル交換が必要なときを知りたいと思っています。メソッドを追加すると、基本的にメンバー変数の値を使用するメソッドが追加されたとします。
よろしいですか?しかし、それは本当に良くありません。あなたは、車が外部の世界へのオイル交換が必要かどうかを車がどのように判断するかを明らかにしています。どうして?
おそらく2015年に車が出てきて、それはこのようには動作しません。おそらく、オイルの汚れたセンサーがあり、オイルの状態を絶えず監視しており、オイル交換が必要なときはベースになっています。
ここでは、上記の2つの方法はまったく価値がありません。
あなたの代わりに
boolean needsOilChange()
メソッドを追加した場合は、クラスのインターフェイスは実装がなかったとしても、カントー変更する必要はないでしょう。
- 1. コンストラクタ内の初期化リスト
- 2. コンストラクタ内の初期化ブロック
- 3. 変数の初期化とコンストラクタ
- 4. コンストラクタ内の変数の初期化の適切な順序
- 5. コンストラクタ初期化リスト内の値を変換するC++
- 6. 初期化リストを介してコンストラクタ内のクラスメンバー(ベクトル)を初期化する
- 7. コンストラクタ内のDBの動的初期化
- 8. Javaのコンストラクタの前に最終変数を初期化する
- 9. クラスのコンストラクタでifstream変数を初期化する
- 10. コンストラクタの初期化リストで配列を初期化する
- 11. PHPコンストラクタなしでクラス変数を初期化する
- 12. コンストラクタまたは宣言で変数を初期化する
- 13. コンストラクタの初期化子内のマップの初期化子リストを使用
- 14. コンストラクタの初期化リストをコピーする
- 15. コンストラクタの配列初期化
- 16. コンストラクタの初期化リストは、
- 17. コンストラクタでの初期化、ベストプラクティス?
- 18. Javaの初期化コンストラクタ
- 19. テンプレートテンプレートパラメータ:コンストラクタの初期化
- 20. jsonファイルをデシリアライズしてコンストラクタ内のオブジェクトデータを初期化する
- 21. コンストラクタ内のHINSTANCEへの参照を初期化する
- 22. 空の初期化を伴うコンストラクタの初期化リスト
- 23. c#TypeInitializationException静的コンストラクタ内のジェネリックコレクションを初期化するとき
- 24. インスタンスのコンストラクタ内で静的メンバーを初期化する
- 25. オブジェクト型コンストラクタを初期化するoracle
- 26. コンストラクタの初期化子リストのメンバでない初期化
- 27. フィールドをインラインまたはコンストラクタ内で初期化する
- 28. 初期化以上のコンストラクタを初期化する最良の方法
- 29. 複数のパラメータでコンストラクタを初期化する
- 30. PHPのコンストラクタでクラス定数を初期化する
変更不能なオブジェクト – Joe