2 回答

TA貢獻1853條經驗 獲得超9個贊
在 Guice 中,您必須實現一個模塊(覆蓋AbstractModule類)并將 Animal 綁定到特定的實現類。要回答您的問題:
您當然可以調用animal.getClass()以在運行時檢查注入了哪個實現類。但這會打破 IOC 的原則,即無論您使用哪種具體實現都無關緊要。
要強制animal您AnimalStateManager成為貓,您必須編寫自己的模塊。
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()

TA貢獻1796條經驗 獲得超4個贊
我認為另一個重要問題是您將如何同時使用 MakeSound 和 MakeSoundOnce 對象。在上面創建的同一模塊中,有多種方法可以指定您想要的類型,這兩種方法都是綁定注釋的方法(https://github.com/google/guice/wiki/BindingAnnotations):
1)您可以使用Guice提供的@Named注解。您將擁有如下所示的內容:
@Override
protected void configure() {
bind(Animal.class).annotatedWith(Names.named("Cat")).to(Cat.class);
bind(Animal.class).annotatedWith(Names.named("Dog")).to(Dog.class);
}
然后將用于:
@Inject @Named("Cat") private Animal animal;
在您的 *MakeSound 課程中。
2)您還可以創建自己的注釋(在上面的同一鏈接中進行了非常詳細的描述),這將使您可以選擇使用:
@Inject @Cat private Animal animal;
在您的 *MakeSound 課程中。大多數時候我們堅持使用@Named 注解,因為它不需要創建額外的注解接口。
*MakeSound 類會通過注入實現嗎?并且您是否需要在您描述的 *MakeSound 類中切換 Dog/Cat 實現(即,希望貓只喵一次,反之亦然)?
添加回答
舉報