3

Total Guice noobは、いくつかの記事を読み、紹介ビデオを見ました。それだけです。

これが私が「guicifiy」しようとしている単純化された古いコードです。(私が理解している限り)@inject2つのコンストラクターのうちの1つにしか注釈を付けられないので、その方法を完全に理解することはできませんか?呼び出し元のクラスはどのようにして一方または他方のインスタンスを作成できますか?それとも、これをどうにかしてリファクタリングする必要がありますか?

public class MyDialog extends JDialog {
    public MyDialog( JFrame parent, <other parameters...> ) {
        super( parent );
    }

    public MyDialog( JDialog parent, <other parameters...>) {
        super( parent );
    }
 }
4

3 に答える 3

4

1つのctorにのみ注入できます。

このクラスの使用方法に応じて、次のことができます。

  • 2つの「新しい」メソッドを使用してファクトリをクライアントコードに挿入します。
  • すべての引数を1つのコンストラクターにロールし、不要な場合はnullを渡します。

呼び出し元のクラスはどのようにして一方または他方のインスタンスを作成できますか?

これは、呼び出し元のクラスがMyDialogの複数のインスタンスを必要とすることを示唆していますか?次に、手巻きのファクトリを使用する必要があります(Ctorが1つしかない場合は、Assisted Injectでこれを処理できます)。あなたが何をしているのか詳細はわかりません。あなたがすでに知っていることを繰り返す可能性がありますが、空白のステートメントとして、MyDialogからインターフェイスを抽出し、ファクトリに返してもらうことをお勧めします。このようにして、テストでMyDialogを偽造できます。

于 2009-12-04T11:47:20.977 に答える
2

コンストラクターの注入は非常にクリーンです。mlkは正しいです、あなたが1つのコンストラクターにしか注入できないと言っています。

できることは、メソッドインジェクションを使用することです。

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クラスメソッドを呼び出し、すべてのインジェクションを提供することです。次に、コンストラクターと同じことを行います。つまり、オブジェクトをクラスの属性に割り当てます。

于 2009-12-15T11:04:20.607 に答える
1

以前のコメントに同意します。追加のヒント:コンストラクターインジェクションは、クラスが必要とするすべての依存関係を提供することになっています。mlkが言うように、1つのアプローチは、ほとんどの引数でコンストラクターに注釈を付け、必要に応じてnull値を渡すことによって、コンストラクターにリファクタリングして前者を呼び出すことです。さらに、Guice 3.0は、プログラマーが使用するコンストラクターを指定できる、
いわゆるコンストラクターバインディングをサポートしています。詳細については、こちらをご覧ください。

于 2012-08-23T08:14:12.843 に答える