Effective Javaを読んでいる⑰

継承することを前提に設計する(そしてドキュメントを書く)か継承させないかどっちかにしろ

  • Javadocに継承したらどうなるのか書いとけ
  • overrideしたらどうなるのか書いとけ

コンストラクタはオーバーライド可能なメソッドを呼んではいけない

スーパークラスコンストラクタはサブクラスのコンストラクタよりさきに呼ばれるので、初期化される前にオーバーライドしたメソッドが呼ばれる。 public class Yeah { public Yeah(){ test(); }

protected void test(){

}

public static void main(String args[]){
    //nullが出力される
    new SubYeah();
}

}

class SubYeah extends Yeah{

private final Integer num;

public SubYeah(){
    num = 1;
}

@Override
protected void test(){
    System.out.println(num);
}

}

finalのフィールドが、nullの時と1のときの2つの状態ができてしまう。

#### CloneableとSerializableインターフェース

#### オーバーライド可能なメソッドは自分から呼び出さない形で定義すると激アツ