5

すべての引数が GUICE によって注入されるコンストラクターを持つクラスがあります。

Public class Order {

    private final ClassOne classOneObj;
    private final ClassTwo classTwoObj;

    @Inject
    public order(ClassOne classOneObj, ClassTwo classTwoObj){
    this.classOneObj = classOneObj;
    this.classTwoObj = classTwoObj;
    }
}

ここで、注入できないフィールド (たとえば、int ステータス) 変数をもう 1 つ追加したいと思います。

最初に注入されたすべてのパラメーターを使用してオブジェクトを作成し、次にセッター メソッドで注入できない新しいフィールドを設定することは良い方法ですか?

以下に示すように、ファクトリクラスを作成する別のアプローチを思いつきました。

public class OrderFactory {

    private final ClassOne classOneObj;
    private final ClassTwo classTwoObj;

    @Inject
    public order(ClassOne classOneObj, ClassTwo classTwoObj){
    this.classOneObj = classOneObj;
    this.classTwoObj = classTwoObj;
    }

   //getter methods for all the above variables

    public  ClassOne getclassOneObj(){
          return classOneObj;
    }
    ....

    public Order createOrder(int status) {
        return new Order(status, classOneObj, classTwoObj);
    }
}

次に、新しい Order クラスは次のようになります

public class Order {

    int status
    private final ClassOne classOneObj;
    private final ClassTwo classTwoObj;


    public order(int status, ClassOne classOneObj, ClassTwo classTwoObj){
    this.status = status
    this.classOneObj = classOneObj;
    this.classTwoObj = classTwoObj;
    }

    //getter methods for all these member variables
}

注文オブジェクトを作成するには、まず OrderFactory オブジェクトを作成し、次に "createOrder" メソッドを使用して Order オブジェクトを作成します。

私はボイラープレートコードを書くことになっています。これが良い習慣かどうかはわかりません。このアプローチが正しい場合、またはこの問題に対するより良いアプローチがある場合、誰かがこれについて提案できますか?

Google Guice を読んだところ、@Assisted という機能があり、そのような場合のアシスト インジェクションが可能であることがわかりました。しかし、私はそれが複雑であることに気づき、自分の場合にそれを使用する必要があるかどうかを確信できませんでした.

提案やガイダンスをお寄せいただきありがとうございます。

4

2 に答える 2

4

貴社の工場アプローチは優れています。セッターを使用しないでください。フィールドを不変にできる場合は、インスタンス化が「便利」になるかどうかに関係なく、不変にする必要があります。

実行できる別のアプローチは、この問題を正確に解決するAssisted Injectionです。これで、ファクトリ インターフェイスを定義するだけで、その実装は Guice によって魔法のように与えられます。

class Order {
  interface Factory {
    Order create(Status status);
  }

  @AssistedInject Order(
      ClassOne one, 
      ClassTwo two, 
      @Assisted Status status) {
  }
}

モジュールコード:

bind(Order.Factory.class).toProvider(
    FactoryProvider.newFactory(Order.Factory.class, Order.class));

Factory次に、クライアントは、例と同じようにそれを注入して使用します。

于 2013-11-02T00:14:33.787 に答える
-1

通常、構築するのにある程度の労力がかかるものを注入します。int フィールドを注入するだけの場合は、オブジェクトで setter メソッドを呼び出すだけの方がよいでしょう (より複雑な依存関係が注入されています)。また、「ステータス」と呼ばれるフィールドによって暗示されるように、フィールドが頻繁に変更される場合も、インジェクションの対象にはなりません。

于 2013-11-01T22:49:53.817 に答える