我有一个有两个构造函数的类。我正在尝试使用 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();
}
下面是我在抽象模块实现类中的模块绑定。
install(new FactoryModuleBuilder()
.implement(PigBagMapper.class, PigBagMapperImpl.class)
.implement(JsonMapper.class, JsonMapperImpl.class)
.build(MapperFactory.class));
下面是我如何调用构造函数。
mapperFactory.createJsonMapper(apiName);
我在这里做错了什么?任何帮助都将不胜感激。
编辑:
请注意,JsonMapperImpl类没有构造函数。它只有一个公共方法,仅此而已。
我看到两个问题。
问题1:您不需要用< code>@Assisted注释工厂方法
问题2:当您使用工厂时,Guice将尝试创建JsonMapperImpl
的isn值。它将扫描用@AssistedInject
注释的正确的JsonMapperImpl
构造函数。没有。例如,您不能调用new JsonMapperImpl("xyz")
。这将是编译时错误,因为构造函数JsonMapperImpl(String)未定义。
您也没有在 JsonMapperImpl
中使用 @AssistedInject
注释的构造函数。它是空的。
如果您以类似的方式重写您的类:
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
将公开适当的构造函数,代码将起作用,例如:
JsonMapper noApi = factory.createJsonMapper();
JsonMapper api = factory.createJsonMapper("test");
System.out.println(noApi.getAPI());
System.out.println(api.getAPI());
输出:
null
test
希望这有帮助。
有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn
我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这
为什么: 如果一个类不提供任何然后在编译时由编译器给出,但是如果一个类包含,那么默认构造函数不是由编译器提供。 我正在编译下面的代码。它给出了编译错误。 代码: 控制台错误: 当我只调用。工作正常。但是当您想使用参数化构造函数调用
问题内容: 假设我有一些类似以下的课程。(为简单起见,这是一个虚构类。) 由于我使用不同的实现,并且可能想对该发送功能进行单元测试,因此我认为我应该注入in 的方法。但是我该怎么做呢? 我见过的所有我理解的Guice示例似乎都是在构造函数中进行注入的: 但是我的类在其构造函数中接受了一个参数,我不想注入该参数。那我该怎么办呢? (注意:我是一个完整的Google Guice noob。我认为我了解
问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数
问题内容: 我知道我在这里问一些严重的101问题… 我有一些课,还有一个延伸课。在我有一个构造函数,它接受一组参数,并对其字段进行设置。派生类(例如)通常不需要进行修改。现在我的IDE给我 “ Foo中没有默认的构造函数” 。从一点点谷歌搜索,这似乎是因为“构造函数没有继承”。因此,一切都很好,但是我现在如何使它工作而不在每个派生类中复制此构造函数?我假设有一个更合理的方法? 问题答案: 使用构造