0

注釈に応じてクラスの 2 つの異なるインスタンスをバインドできるようにする Guice バインディング注釈を作成しました。

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

クラスの 1 つに依存する List を提供するプロバイダー メソッドを作成できることを望んでいましたが、これに注釈を使用する方法がわかりません。

@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 クラスの 2 つのインスタンスの方が単純なように思えnewますが、これはバインディング アノテーションの使用方法ではないかもしれません。

このシナリオでバインディング アノテーションを最大限に活用する方法についてコメントをいただければ幸いです。

ありがとう

4

1 に答える 1

7

それが本当にあなたが望むものなら、ここに実用的な解決策があります:

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を使用してください。
  • その問題を解決するためにマルチバインディングを検討することができます。
于 2012-11-01T11:32:52.480 に答える