我的问题归结为使用 @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适当") 注释来标记每个字符串,但这只会导致更多配置错误。从这些错误的声音来看,他们不希望在工厂类上绑定注释,所以我没有尝试自定义绑定注释。
简单而嘈杂的解决方案是创建一个简单的参数类来包含这三个辅助值,然后简单地注入它:
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
}
}
这是有效的,并且可能相当无错误,但噪音很大。一些摆脱嵌套静态类的方法会很好。
谢谢你的帮助!