2012-04-07 8 views
0
public class Widget { 
    @Inject 
    Fizz fizz; 

    public Widget(Fizz fizz) { 
     super(); 

     setFizz(fizz); 
    } 

    public void setFizz(Fizz fizz) { 
     this.fizz = fizz; 
    } 
} 

がこのGuiceのアンチパターンですか?!?!私が言う場合Guiceのアンチパターンですか?

fizzは(@Inject経由)に注入されます」が、その後、私は、コンストラクタとセッターはフィズを受け入れることができ、これは不必要に冗長ですか? Guiceの注射器と衝突する可能性はありますか?

は私がするとして混乱していると思います:あなたは、コンストラクタ/ゲッターを経由して自分でプロパティを「注入」必要があるときに対

  • 、あなたは@Injectとプロパティに注釈を付けなければならないとき

    ご意見はありますか?前もって感謝します!

  • +0

    それは紛争をいただきたい理由を知っている(私は知らない)が、それは特定の目標でない限り、明示的にGuiceの外で独自のフィズを設定禁止する理由がありませんように思えるしないでください。 –

    答えて

    4

    このようなものを使用しないでください(コンストラクタインジェクションを使用してください)。

    public class Widget { 
        private Fizz fizz; 
    
        @Inject 
        public Widget(Fizz fizz) { 
         super(); 
    
         this.fizz = fizz; 
        } 
    
    } 
    

    も参照してくださいhttp://code.google.com/p/google-guice/wiki/Injections

    +0

    違いは何ですか?コンストラクタとは対照的に、プロパティに注釈を付けると、Guiceはどのように異なる動作をしますか? – IAmYourFaja

    +0

    クラスに複数の依存関係が必要な場合は、コンストラクタにアノテーションを付けておくと、すべてのフィールドに注釈を付けることができなくなります。 –

    +0

    違いは、その変数が利用可能になる時刻です。コンストラクタインジェクションを行う場合は、コンストラクタで明示的に使用することができます。ここで、getter/setterインジェクションを使用すると、コンストラクタが終了した後にのみ、注入されたメンバを使用できます。 – mglauche

    1

    私は間違いなく、Guiceには、それを行うことができないではないので、これが問題であると言うだろうが、あなたのコードにはバグがあるため。 Guiceはデフォルトの引数なしのコンストラクタ(存在しない)を呼び出そうとし、失敗します。

    は、しかし、あなたは、引数なしのコンストラクタを追加した場合でも、これはまだアンチパターンです。私はDIフレームワークをしばらく使用しましたが、フィールド注入を行う必要はありませんでした。私はそれがユースケースであると確信しています。そうでなければGuiceの人はそれを含めませんでしたが、バイトコードの操作やリフレクションの特別なコードなしでコードをテストすることは不可能です。

    コンストラクタインジェクションは、多くの理由で一般的に最適です。それはあなたの依存関係が何であるかを呼び出し元に正確に知らせるので、クラスの不変量を同時に初期化することができます(部分的に初期化されたクラスを避けてください)、それは不変のオブジェクトを作成できる唯一のDIフレーバーです。スレッドセーフであり、プログラムの複雑さを軽減します。私は親の依存関係を宣言するサブクラスを要求したくない場合、または私は「オプション」の依存関係をしたいときにメソッド注射用

    私の唯一のユースケースがありますが、これらはまれです。

    3

    コンストラクタインジェクションは、依存関係がである必要があります。です。 使用プロパティインジェクション依存性がオプションです。

    関連する問題