2 つの異なるコンストラクターがある場合、Guice を使用して注入するにはどうすればよいですか?
-
12-09-2019 - |
質問
ここでは完全に Guice 初心者です。いくつかの記事を読み、紹介ビデオを見ました。それだけです。
これは、「GUI化」しようとしている単純化された古いコードです。(私が理解している限りでは) @inject
- 2 つのコンストラクターのうちの 1 つに注釈を付けますか?呼び出しクラスはどのようにしてどちらかのインスタンスを作成できるのでしょうか?それとも何らかの方法でこれをリファクタリングする必要がありますか?
public class MyDialog extends JDialog {
public MyDialog( JFrame parent, <other parameters...> ) {
super( parent );
}
public MyDialog( JDialog parent, <other parameters...>) {
super( parent );
}
}
解決
1 つのクターにのみ注入できます。
このクラスの使用方法に応じて、次のことが可能です。
- 2 つの「新しい」メソッドを使用して、クライアント コードにファクトリを挿入します。
- すべての引数を 1 つの ctor にまとめ、不要な場合は null を渡します。
呼び出しクラスはどのようにしてどちらかのインスタンスを作成できるのでしょうか?
これは、呼び出し側のクラスが MyDialog? の複数のインスタンスを必要とすることを示唆しています。次に、手動ロール工場を使用する必要があります (ctor が 1 つしかない場合は、Assisted Inject がこれを処理できます)。私はあなたが何をしているのか詳細を知りません、そして私はおそらくあなたがすでに知っていることを繰り返すでしょうが、空白のステートメントとして、MyDialog からインターフェイスを抽出し、それをファクトリに返すようにすることをお勧めします。このようにして、テストで MyDialog を偽装できます。
他のヒント
コンストラクタインジェクションは非常にきれいです。 MLKは、あなたが唯一のコンストラクタに注入できることを言って、右です。
利用方法注入を行うことができますどのようなものです。
public class Smt {
private int a;
private Cereal cereal;
private Personality personality;
private ignition;
public Smt() {
this.a = 5;
}
public Smt(int a) {
this.a = a;
}
@Inject
public void setup(@CiniMini Cereal cereal, @Rastafarian Personality personality,
Ignition ignition) {
this.cereal = cereal;
this.personality = personality;
this.ignition = ignition;
}
}
何Guiceのは何だろうと、自分のクラスのsetup
クラスのメソッドを呼び出すと、すべての注射を提供しています。そして、あなたは、コンストラクタのように同じことを行う - あなたのクラスの属性にオブジェクトを割り当てる
前のコメントに同意します。追加のヒント:コンストラクター インジェクションは、クラスに必要なすべての依存関係を提供することになっています。mlk が言うように、1 つのアプローチは、コンストラクターにほとんどの引数で注釈を付けてから、必要に応じて null 値を渡して前者を呼び出すようにもう一方をリファクタリングすることです。
さらに、Guice 3.0 はいわゆる コンストラクターのバインディング これにより、プログラマはどのコンストラクターを使用するかを指定できます。見る ここ 詳細については。