初期化をコンストラクタの外に用意する手法、現場では多い気がするが?
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にしましょう。