Effective Java(項目14)
うー、すすまん・・・1日1項目ですか・・・
○項目14 継承よりコンポジションを選ぶ
- 不適切な継承はカプセル化を壊す
→その壊し具合についても例が書いてあるんだけど、わかったようで言葉で上手く説明できない。例をそのまま書くのもアレなので省略。んでヘタに継承するぐらいならコンポジション使いましょうよ、という話
- 既存クラスのインスタンスを参照するprivateなフィールドを持たせる
--既存のクラスを新しいクラスのコンポーネントとして使う(コンポジション)ことで、それぞれの頑強性を壊さずに済む
--必要に応じて新しいクラスは既存のクラスのインスタンスの適切なメソッドを呼び出して結果を返す(転送)する
- この「コンポジション」と「転送」の組合せは委譲(delegation)だーと思ったらそうではないと念を押して書いてあった
→委譲はラッパークラスと被ラッパークラスの関係を指すそうな・・・デザパタ要確認
- ちなみにラッパークラスの中身をコールバックするのは良くない
→中身がラッパーを回避してしまう(『SELF問題』というらしい)
- あくまで継承はそれがサブタイプであるとき、is-a関係が成り立っているときに使いましょう
- Javaプラットフォームライブラリにもこの原則を破っているものが多くある
→StackはVectorを拡張すべきではない、PropertiesはHashtableを拡張すべきではない
- 委譲とコンポジション&転送、向きが違う?
追記:どちらも何かをラップしているのは違いなくて、内側に何かを渡す場合(ラッパー)は委譲、そうでない場合はコンポジション&転送ってこと、カモ