2012-11-01 23 views
0

我創建吉斯結合註釋,允許根據註釋例如我把一個類的兩個不同的實例:吉斯 - 如何使用綁定註釋來構建對象的列表

bind(Animal.class).withAnnotation(Cat.class).toInstance(new Animal("Meow")); 
bind(Animal.class).withAnnotation(Dog.class).toInstance(new Animal("Woof")); 

我希望能夠創建一個提供方法,提供了一個列表是我的一個類的依賴,但無法弄清楚如何使用這個註釋:

@Provider 
List<Animal> provideAnimalList() { 
    List<Animal> animals = new ArrayList<Animal>(); 
    animals.add(@Cat Animal.class); // No, but this is what I want 
    animals.add(@Dog Animal.class); // No, but this is what I want 
    return animals; 
} 

所以我假設我只想能夠在我的參數add()中使用註釋列表的方法...但沒有。

我應該如何處理這個問題?在我看來,簡單來說,對於Animal類的兩個實例來說,這可能會更簡單一些,也許這並不意味着要使用綁定註釋。

我很感謝在這種情況下最好地使用綁定註釋。

感謝

回答

6

如果真的是你想要的東西,在這裏工作的解決方案:

public class AnimalModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(Animal.class).annotatedWith(Cat.class).toInstance(new Animal("Meow")); 
     bind(Animal.class).annotatedWith(Dog.class).toInstance(new Animal("Woof")); 
    } 

    @Provides 
    List<Animal> provideAnimalList(@Cat Animal cat, @Dog Animal dog) { 
     List<Animal> animals = new ArrayList<Animal>(); 
     animals.add(cat); 
     animals.add(dog); 
     return animals; 
    } 

    public static void main(String[] args) { 
     List<Animal> animals = Guice.createInjector(new AnimalModule()).getInstance(Key.get(new TypeLiteral<List<Animal>>() { 
     })); 
     for (Animal animal : animals) { 
      System.out.println(animal); 
     } 
    } 
} 

註釋:

@Retention(value = RetentionPolicy.RUNTIME) 
@BindingAnnotation 
public @interface Cat { 
} 

輸出:

Animal{sound='Meow'} 
Animal{sound='Woof'} 

但是

  • 不要創建特定的註釋,在這種情況下似乎不必要。使用@Named代替,
  • 您可以考慮Multibindings來解決該問題。
+2

+1對於多重綁定。 –

+0

對於多重綁定,這看起來是解決這個問題的正確解決方案(很容易擴展)。 – jfpoilpret

+0

來自doc:由於編譯器無法檢查字符串,我們建議謹慎使用@Named – user443854