public class AppModule extends AbstractModule {
@Override
protected void configure() {
install(new FactoryModuleBuilder().implement(BaseClass.class, ImplementingClass.class).build(FactoryClass.class));
}
}
public class AnotherClass {
@Inject
private FactoryClass factoryClass;
private BaseClass firstBaseObject = factoryClass.create("some_parameter");
private BaseClass secondBaseObject = factoryClass.create("another_parameter");
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}
有没有办法让我在每次调用 processSomething()
时都可以访问 firstBaseObject
和 secondBaseObject
? processSomething()
的每次调用都依赖于已经实例化的这两个对象,并且它们是具有大量元数据的巨大对象。即,我可以以某种方式确保在命中这两行时 factoryClass
已经实例化吗?:
private BaseClass firstBaseObject = factoryClass.create("some_parameter");
private BaseClass secondBaseObject = factoryClass.create("another_parameter");
我在这两行上收到 NullPointerExceptions,因为 factoryClass
为 null。
如果您需要更多信息,请告诉我,非常感谢!
最佳答案
使用下面的代码
public class AnotherClass {
private final BaseClass firstBaseObject;
private final BaseClass secondBaseObject;
@Inject
public AnotherClass(FactoryClass factoryClass) {
firstBaseObject = factoryClass.create("some_parameter");
secondBaseObject = factoryClass.create("another_parameter");
}
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}
不能使用字段或方法注入(inject),因为factoryClass中的注入(inject)是在填充firstBaseObject和secondBaseObject之后进行的。
或者
public class AppModule extends AbstractModule {
@Override
protected void configure() {
...
bind(BaseClass.class)
.annotatedWith(Names.named("firstBaseObject"))
.toInstance(factoryClass.create("some_parameter"));
bind(BaseClass.class)
.annotatedWith(Names.named("secondBaseObject"))
.toInstance(factoryClass.create("another_parameter"));
}
}
public class AnotherClass {
@Inject
@Named("firstBaseObject")
private BaseClass firstBaseObject;
@Inject
@Named("secondBaseObject")
private BaseClass secondBaseObject;
public void processSomething() {
// ... do something that requires both firstBaseObject and secondBaseObject to already be initialized on each call
}
}
关于java - 谷歌Guice : use injected factory to instantiate multiple objects in a class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34279529/