23

私の問題は、ファクトリへの 2 つの文字列引数で @Assisted を使用することに要約されます。問題は、Guice が型をパラメーターの識別メカニズムとして扱うため、両方のパラメーターが同じであり、構成エラーが発生することです。

いくつかのコード:

public class FilePathSolicitingDialog {

    //... some fields

    public static interface Factory {
        public FilePathSolicitingDialog make(Path existingPath,
                                             String allowedFileExtension,
                                             String dialogTitle);
    }

    @Inject
    public FilePathSolicitingDialog(EventBus eventBus,
                                    SelectPathAndSetTextListener.Factory listenerFactory,
                                    FilePathDialogView view,
                                    @Assisted Path existingPath,
                                    @Assisted String allowedFileExtension,
                                    @Assisted String dialogTitle) {
        //... typical ctor, this.thing = thing
    }

    // ... methods
}

問題は、二重文字列パラメーターにあります。

各文字列に個別の @Named("as appropriate") 注釈を付けようとしましたが、構成エラーが増えるだけです。これらのエラーの音から、彼らはファクトリ クラスにバインディング アノテーションを望んでいないので、カスタム バインディング アノテーションは試していません。

シンプルでノイズの多い解決策は、これら 3 つの補助値を含む単純な引数クラスを作成し、単純にそれを注入することです。

    public static class Config{
        private final Path existingPath;
        private final String allowedFileExtension;
        private final String dialogTitle;

        public Config(Path existingPath, String allowedFileExtension, String dialogTitle){
            this.existingPath = existingPath;
            this.allowedFileExtension = allowedFileExtension;
            this.dialogTitle = dialogTitle;
        }
    }

    public static interface Factory {
        public FilePathSolicitingDialogController make(Config config);
    }

    @Inject
    public FilePathSolicitingDialogController(EventBus eventBus,
                                              SelectPathAndSetTextListener.Factory listenerFactory,
                                              FilePathDialogView view,
                                              @Assisted Config config) {
        //reasonably standard ctor, some this.thing = thing
        // other this.thing = config.thing
    }
}

これは機能し、かなりバグがない可能性がありますが、うるさいです。そのネストされた静的クラスを取り除く何らかの方法があればいいでしょう。

助けてくれてありがとう!

4

1 に答える 1

39

このドキュメントをご覧ください(以前はこちら):

パラメータの型を区別する

ファクトリ メソッドのパラメーターの型は異なる必要があります。同じ型の複数のパラメーターを使用するには、名前@Assisted付き注釈を使用してパラメーターを明確にします。名前は、ファクトリ メソッドのパラメーターに適用する必要があります。

public interface PaymentFactory {
   Payment create(
       @Assisted("startDate") Date startDate,
       @Assisted("dueDate") Date dueDate,
       Money amount);
 }

...そして具象型のコンストラクターパラメーターに:

public class RealPayment implements Payment {
   @Inject
   public RealPayment(
      CreditService creditService,
      AuthService authService,
      @Assisted("startDate") Date startDate,
      @Assisted("dueDate") Date dueDate,
      @Assisted Money amount) {
     ...
   }
 }
于 2014-05-08T23:51:49.687 に答える