Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

init()メソッド

初期化をコンストラクタの外に用意する手法、現場では多い気がするが?

class TestSuper{
    TestSuper(){
	this.init();
    }

    void init(){
	System.out.println("initialize Super fields");
    }

}

class TestSub extends TestSuper{
    TestSub(){
	this.init();
    }

    void init(){
	System.out.println("initialize Sub fields");
    }
}

継承してTestSubを作ったんだが、これは実は間違い。TestSuper t = new TestSub();とすると、作者の意図としてはTestSuper.init()でスーパークラス用のフィールド、TestSub.init()でサブクラス用のフィールドを初期化したいのだが、TestSuper.init()は走らずに、TestSub.init()が二回走ってしまう。

やるなら、initをfinalかprivateにしましょう。