首先我不得不说我尝试用谷歌搜索这个问题的答案,但没有答案解释我的疑虑。 反正, 我想了解的是:
public interface Animal{
public void makeSound(int times);
}
该接口(interface)有两种不同的实现:
public class Cat implements Animal{
@Override
public void makeSound(int times){
for(int=0;i<times;i++){
this.meow();
}
}
}
public class Dog implements Animal{
@Override
public void makeSound(int times){
for(int=0;i<times;i++){
this.wolf();
}
}
}
我将使用这些实现,如下例所示:
public class AnimalStateManager {
@Inject
private Animal animal;
public void makeAnimalAct(){
animal.makeSound(100)
}
}
更新 1.1 至帖子
我还有一个使用相同“动物”界面的类:
public class AnimalMakeSoundOnce {
@Inject
private Animal animal;
public void makeSoundOnce(){
animal.makeSound(1)
}
}
所以我的问题是: 1-我如何知道什么实现将被注入(inject)到 AnimalStateManager 中? 2-如果我想强制“AnimalStateManager”上的“动物”对象成为猫怎么办?
更新 1.1 至帖子 3- 如果我想让 AnimalMakeSoundOnce 使用 Dog 实现,而 AnimalStateManager 使用 Cat 实现,该怎么办?
提前致谢
最佳答案
在 Guice 中,您必须实现一个模块(覆盖 AbstractModule
类)并将 Animal 绑定(bind)到特定的实现类。
回答您的问题:
您当然可以调用
animal.getClass()
在运行时检查注入(inject)了哪个实现类。但这会打破 IOC 的原则,即无论您使用哪种具体实现都无关紧要。要强制
AnimalStateManager
中的animal
为 cat,您必须编写自己的模块。public class AnimalStateModule extends AbstractModule { @Override protected void configure() { bind(Animal.class).to(Cat.class); } }
并实例化 AnimalState:
Injector inj = Guice.createInjector(new AnimalStateModule());
final AnimalStateManager ass = inj.getInstance(AnimalStateManager.class);
ass.makeAnimalAct(); // will cause a call to Cat.meow()
关于java - Guice - 使用两种不同的实现注入(inject)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54987906/