0
1

More than 3 years have passed since last update.

【Java】DIを使用したAbstractクラスのメソッドを子クラスから呼び出す処理作成時の注意点

Last updated at Posted at 2020-01-10

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クラスで宣言した内容が継承されるので、そもそも論再度宣言する必要はないのですが、、
処理内容(記述内容)が増加してくると、見落としてうっかりやりがちなので、注意しましょう。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1