DIを使用したAbstractクラスのメソッドを子クラスから呼び出す処理を作成する際のの注意点です。
問題のあるコード
Abstractクラス
public class AbstractFoo {
// DI
public Bar bar;
protected void update() {
bar.update();
}
}
子クラス
public class ChildFoo extends AbstractFoo {
// DI
public Bar bar;
public void updateChild() {
// Abstractクラスのupdateメソッドを実行
update();
}
}
実行結果
子クラスのupdateChildメソッドを実行すると、呼び出し先の親クラスのupdateメソッドでNullPointerExceptionで落ちる
対処方法
子クラスのDI
public Bar bar;
を削除する(下記では分かりやすいようにコメントアウト)
修正後
Abstractクラス
public class AbstractFoo {
// DI
public Bar bar;
protected void update() {
bar.update();
}
}
子クラス
public class ChildFoo extends AbstractFoo {
// DI
// public Bar bar;
public void updateChild() {
// Abstractクラスのupdateメソッドを実行
update();
}
}
所感など
DIの内容を子クラスでの宣言によって上書き → Abstractクラスに渡してあげていないので、結果Abstractクラスでbarがnullになります。
子クラスではAbstractクラスで宣言した内容が継承されるので、そもそも論再度宣言する必要はないのですが、、
処理内容(記述内容)が増加してくると、見落としてうっかりやりがちなので、注意しましょう。