Java 将@Assisted inject与多个相同类型的参数(@Named params)一起使用

Java 将@Assisted inject与多个相同类型的参数(@Named params)一起使用,java,dependency-injection,guice,assisted-inject,Java,Dependency Injection,Guice,Assisted Inject,我的问题归结为使用@Assisted和两个字符串参数到工厂。问题是,因为Guice将类型视为参数的标识机制,所以这两个参数是相同的,并且我得到了一个配置错误 一些代码: public class FilePathSolicitingDialog { //... some fields public static interface Factory { public FilePathSolicitingDialog make(Path existingPath,

我的问题归结为使用@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(“视情况而定”)注释标记每个字符串,但这只会导致更多配置错误。从这些错误的声音来看,他们不希望在工厂类上使用绑定注释,所以我没有尝试过自定义绑定注释

简单而嘈杂的解决方案是创建一个简单的参数类来包含这三个辅助值,并简单地注入:

    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
    }
}
这是可行的,可能是相当无bug,但噪音。某种摆脱嵌套静态类的方法会很好

谢谢你的帮助

看一看(以前):

使参数类型不同

工厂方法参数的类型必须不同。使用 同一类型的多个参数,使用命名的
@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) {
     ...
   }
 }
…以及混凝土类型的构造函数参数:

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) {
     ...
   }
 }

谢谢在GoogleGuice v4上工作成功。(此答案自2018年4月24日起有效)