Effective java 3版 読書会 5日目
実施日時:2019/1/9 22:00~23:00
対象範囲:項目19~項目20
参加者:yodai、yoridori、やぎた、kassyi
形式:オンライン(discord)
課題本を事前に読み、実業務と照らし合わせて記述内容の
議論をする。
項目19 継承のために雪渓及び文書化する、でなければ継承を禁止する
実装要件をきちんと文書化して残す必要がある。
そうでなければ、継承をするべきでない。
protectedの設計は、publicの設計と同じく注意して設計する必要が有る。
P97からのソースについて、サブクラスをインスタンス化すると、暗黙のスーパークラスのコンストラクタの呼び出しでスーパークラスのメソッドが呼ばれる。
そのため、最初のoverrideMeの結果がNullになる。
継承のための文書化や設計が出来ない場合、アッパークラスはヘルパークラスを使うようにする
項目20 抽象クラスよりもインターフェースを選ぶ
ミックスイン:1クラスに複数インターフェースを書けるので、強力な型の定義が出来る。
そのため、複数の振る舞いを持つ型を定義できる。
骨格実装:インターフェースと抽象クラスが混ざったものではなく、
抽象クラスと考えた方が良い
テンプレートメソッドパターンが骨格実装
テンプレートメソッドパターンを例にすると
骨格実装:AbstractClass
具象実装:ConcreteClass
テンプレートメソッドパターン:
https://qiita.com/shoheiyokoyama/items/c2ce16b4f492cd014d50
骨格実装クラスとは、抽象クラスにメソッドを置いてそれにインターフェースを付ける形になるのではないか。
P105最後、インターフェースの制約というのが良く分からない
サブクラスでは、インターフェースのメソッド実装を強制できない事なのか?
その場合、スーパークラスで抽象メソッドを定義させる必要があることか?
骨格実装クラスを使用する場合、テンプレートメソッドパターンで大丈夫な模様
骨格実装について、インターフェースの制約について
// 骨格
// defaultメソッドでもできるけど・・・
public interface InterfaceTest {
public void method();
public void doSomething();
}
public abstract class AbstractTest implements InterfaceTest {
// インターフェースに対する制約
// インターフェースだとインスタンス変数は持てない・・・とか?
int i = 0;
@Override
public void method() {
// ほねのロジック
this.i = 10;
doSomething();
}
}
// 具象クラス
public class Concrete extends AbstractTest {
@Override
public void doSomething() {
System.out.println(this.i);
}
}
public class TestMain {
public static void main(String[] args) {
InterfaceTest test = new Concrete();
test.method();
}
}
なのでしょうか・・・
インターフェースの制約は・・・
協力:Tech Baton
https://tech-baton.studio.design/