我有一个有两个构造函数的类。我正在尝试使用guice工厂创建此类的实例。如果没有传递参数,则应调用默认构造函数。如果传递参数,则应调用带参数的构造函数。但是,即使我将参数传递给工厂方法,仍然会调用默认构造函数。带参数的构造函数根本不会被调用。以下是我的工厂类。
public interface MapperFactory {
PigBagMapper createPigBagMapper(@Assisted("pigMetaInfoList") List<String> sourceMetaInfoList);
JsonMapper createJsonMapper(@Assisted("apiName") String apiName) throws EndpointNotFoundException, JsonMapperException;
JsonMapper createJsonMapper();
}
以下是我想要注入的构造函数。
@AssistedInject
public JsonMapper() {
handlers = new LinkedList<>();
}
@AssistedInject
public JsonMapper(@Assisted("apiName") String apiName) throws EndpointNotFoundException, JsonMapperException {
somelogic();
}
下面是我在Abstract Module实现类的模块绑定。
install(new FactoryModuleBuilder()
.implement(PigBagMapper.class, PigBagMapperImpl.class)
.implement(JsonMapper.class, JsonMapperImpl.class)
.build(MapperFactory.class));
以下是我调用构造函数的方法。
mapperFactory.createJsonMapper(apiName);
我在这里做错了什么?任何帮助将不胜感激。
编辑:
请注意,JsonMapperImpl类没有构造函数。它只是一个公共方法,就是这样。
答案 0 :(得分:5)
我看到两个问题。
问题1:您无需使用Object.values
问题2:当您使用工厂时,Guice会尝试创建scope.$watchCollection(function() {
return Object.values(obj);
}, function(newValues, oldValues) {
// now you are watching all the values for changes!
// if you want to fire a callback with the object as an argument:
if (angular.isFunction(scope.callback())) {
scope.callback()(obj);
}
});
的isntance。它将扫描使用@Assisted
注释的正确 JsonMapperImpl
结构。没有了。例如,您无法调用JsonMapperImpl
。这将是编译时错误,因为构造函数JsonMapperImpl(String)未定义。
您在@AssistedInject
中也没有使用new JsonMapperImpl("xyz")
注释的构造函数。它是空的。
如果您以类似的方式重写课程:
@AssistedInject
和
JsonMapperImpl
然后public class JsonMapperImpl extends JsonMapper
{
@AssistedInject
public JsonMapperImpl() {
super();
}
@AssistedInject
public JsonMapperImpl(@Assisted String apiName) {
super(apiName);
}
}
将公开适当的构造函数,代码将起作用,例如:
public class JsonMapper
{
private String apiName;
public JsonMapper() {
}
public JsonMapper(String apiName) {
this.apiName = apiName;
}
public String getAPI(){return apiName;}
}
输出:
JsonMapperImpl
希望这有帮助。