2017-06-27 11 views
0

クラスの注入コンストラクタでは、適切なパラメータでスーパーコンストラクタを呼び出す必要があります。 superは多態性によって子クラスのメソッドを呼び出す必要があります(同じメソッドを実装する同じ親クラスから複数のサブクラスがあります)。 問題は、子クラスのメソッドは、すでにメンバ変数が注入されていることに依存するということです。私の場合のサブクラスは、さまざまな型の複数の変数に依存しています。 さらに、親クラスは、私が変更できないライブラリのネイティブクラスです。それを手動で初期化する以外に継承されたメソッドを呼び出す前に、メンバ変数を注入する方法はあり注入コンストラクタの前にメンバ変数を挿入する

public class A { 

    @Inject 
    public A(SomeType t) 
    { 
     workon(t1); 
    } 
} 


public class B extends A{ 

    @Inject 
    private MemberType mt; 

    @Inject 
    public B(SomeType t) 
    { 
     super(t) 
    } 

    public void workOn(SomeType t) 
    { 
     // mt is not set yet since this method 
     // is called from the super constructor! 
     mt.setT(t); 
    } 
} 

: 以下の例示的な、非常に単純化され、コードを参照してください?

+2

Bのインスタンスを作成するには、同じインスタンスが必要です。まあ、それはデザイン上の瑕疵のようなにおいがします。 – Juvanis

答えて

1

は、明示的にAのコンストラクタにMemberTypeのインスタンスを注入:

一般
interface Workon { 
    public void workon(SomeType t); 
} 

class MemberType implements Workon { 
    public void workon(SomeType t) { 
     this.setT(t);   
    } 
} 

class A { 
    @Inject 
    public A(SomeType t, Workon w) { 
     w.workon(t); 
    } 
} 

class B extends A { 
    private final MemberType mt; 

    @Inject 
    public B(SomeType t, MemberType mt) { 
     super(t, mt); 
     this.mt = mt; 
    } 
} 

、コンストラクタ・インジェクションはあなたの友達です。クラスにというものがある場合は、のように、コンストラクタでというものを明示的に必要とすることが最適な場合があります。なぜなら、必要なときに準備が整っていることがわかっているからです。これは時には新しいタイプのものを思い付くことを必要とするでしょう。

この場合、workonメソッドの特定の動作によって、コンストラクタの動作がAに変更されます。つまり、それはAのコンストラクタの動作のパラメータです。実際のパラメータにしてください。


あなたがAのコンストラクタを変更することはできませんし、それが可能だときAが明示的にworkonの結果に依存しないと仮定して、あなたもBからworkon()の実際の実装を呼び出すことができた場合:

class B extends A { 
    SomeType t; 
    MemberType t; 

    public B (SomeType t) { 
     super(t); 
     this.t = t; 
    } 

    public void workon(SomeType t) { 
     // do nothing here 
    } 

    // should get called after the object is fully constructed 
    @Inject 
    public void setMt(MemberType mt) { 
     this.mt = mt; 
     // what workon() did 
     mt.setT(t); 
    } 
} 
+0

これは確かに1つの解決策ですが、サブクラスにはさまざまな要件があり、スーパーコンストラクタを変更することはできません(上記の例は単純化です) – AHH

+0

(おそらく壊れている)コンストラクタを変更できないことは、あなたの質問に言及する必要があります。 – millimoose

+0

@AHH - もう一度やってみてください.2番目の解決策の作業がまだあなたのケースのいくつかの詳細に依存しているかどうかは分かりません。 – millimoose

関連する問題