亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Guice - 使用兩種不同的實現注入對象

Guice - 使用兩種不同的實現注入對象

慕虎7371278 2022-07-20 10:06:58
首先,我不得不說我嘗試用谷歌搜索這個問題的答案,但沒有答案能解釋我的疑問。無論如何,我想了解的是以下內容:public interface Animal{ public void makeSound(int times);}這個接口有兩種不同的實現: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- 我怎么知道要注入 AnimalStateManager 的實現是什么?2- 如果我想將“AnimalStateManager”上的“動物”對象強制為貓怎么辦?更新 1.1 到 帖子 3- 如果我想讓 AnimalMakeSoundOnce 使用 Dog 實現而 AnimalStateManager 使用 Cat 實現怎么辦?
查看完整描述

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()


查看完整回答
反對 回復 2022-07-20
?
慕的地8271018

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 實現(即,希望貓只喵一次,反之亦然)?


查看完整回答
反對 回復 2022-07-20
  • 2 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號