我的问题归结为使用@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")注释标记每个字符串,但这只会导致更多的配置错误。从这些错误的声音来看,他们不希望在工厂类上使用绑定注释,所以我没有尝试过自定义绑定注释。
简单的解决方案是创建一个简单的参数类来包含这三个辅助值,并简单地注入: 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) { ... } }