2011-10-18 3 views
1

コンストラクタ内でインスタンス変数を初期化する利点について説明してもらえます。オブジェクトが構築された後で同じことができ、それぞれのsettersメソッドを呼び出すことができます。コンストラクタ内の変数を初期化する利点

+5

変更不能なオブジェクト – Joe

答えて

1

メンバ変数を初期化するために外部コードを使用する場合、論理的にはコンストラクタを使用するときと同じようにプログラムが正しい場合がありますが、オブジェクト指向設計全体が欠落しています。

OO開発者の目標は、コードを外部クラスにブラックボックスで表示される自己完結型クラスに分割することです。外部コードは、内部にどのような種類のメンバ変数があるかを知る必要はありません。あなたのクラスのパブリックインターフェイスに依存する必要があるのは、外部コードだけです。そして、あなたがSOLIDの原則に従うならば、あなたのクラスが最低限の数の関数も公開していることを確認するべきです。このようにして、コンシューマのためのきれいな抽象的なインタフェースを提供します。コード内は、必要なだけ複雑にすることができます。

クラスが非常に大きいので、複数のクラスに分割してデータ/関数を再構成し、全体的なデザインがよりよく流れるようにすることができます。データメンバを直接操作する外部コードがある場合は、イメージングを行います。

1

はい、setterで同じことをすることはできますが、必要なすべての変数を設定するまではクラスが矛盾します。さらに、setter呼び出し後に変数を変更できるのはsetterが公開されている場合です
コンストラクタで変数を取ることの利点は、オブジェクトが有効な値でのみ作成されることを保証できることです。
あなたは、コンストラクタの代わりに、同様の静的工場を検討することができます - Item 2 - Creating and Destroying Objects from effective java.

0

ナイーブセッター/ゲッターメソッドが本当にオブジェクト指向プログラミングの腐敗しているお読みください。何がOOのポイントですか?どのようにクラスが動作するかを知る必要があるクラス外のコードなしで彼らの主題が何であるかの複雑さを管理するクラスを作成する。

getter/setterを追加することで、実際にはメンバー変数を実際に公開することなく、クラスがどのように動作するかを基本的に公開しています。

便宜上、私たちはしばしばこれを行いますが、実際にはそれは最良のアイデアではありません。

車をモデル化して、オイル交換が必要なときを知りたいと思っています。メソッドを追加すると、基本的にメンバー変数の値を使用するメソッドが追加されたとします。

よろしいですか?しかし、それは本当に良くありません。あなたは、車が外部の世界へのオイル交換が必要かどうかを車がどのように判断するかを明らかにしています。どうして?

おそらく2015年に車が出てきて、それはこのようには動作しません。おそらく、オイルの汚れたセンサーがあり、オイルの状態を絶えず監視しており、オイル交換が必要なときはベースになっています。

ここでは、上記の2つの方法はまったく価値がありません。

あなたの代わりに

boolean needsOilChange() 

メソッドを追加した場合は、クラスのインターフェイスは実装がなかったとしても、カントー変更する必要はないでしょう。

関連する問題