Думаю, еще один важный вопрос - как вы собираетесь использовать объекты MakeSound и MakeSoundOnce.В том же модуле, созданном выше, есть несколько способов указать, какой тип вы хотите, оба из которых являются описанным методом привязки аннотаций (https://github.com/google/guice/wiki/BindingAnnotations):
1). Вы можете использовать @Namedаннотация предоставлена Guice.У вас будет что-то похожее на следующее:
@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 реализовываться с помощью Injection?И нужно ли вам когда-нибудь переключать реализации Dog / Cat в классах * MakeSound, которые вы описали (т.е. хотите, чтобы кошка только мяукала один раз, и наоборот)?