Guice: разница между Binder # bindConstant() и Binder # bind()... toInstance
Я хотел бы спросить, какая разница между
bindConstant().annotatedWith(Names.named("keepAliveInterval")).to(60);
и
bind(Integer.TYPE).annotatedWith(Names.named("keepAliveInterval")).toInstance(60);
Я хотел бы загрузить все свои свойства конфигурации с помощью Names.bindProperties(binder(), prop); в моем модуле, и я обнаружил, что он использует последний для связывания свойств.
Спасибо, приветствую
Марек
Ответы
Ответ 1
Я думаю, что причины использовать bindConstant()
:
- Для этого требуется использование аннотированной привязки. Вы не можете сделать
bindConstant().to(foo)
. Поскольку типы, с которыми вы связываетесь с ним, являются примитивами и String
s, маловероятно, что привязка без аннотации имеет смысл для любого из них.
- Это требует меньше усилий, поскольку вам не нужно указывать тип (кстати,
bindConstant()
привязывает int
к Integer.class
, а не Integer.TYPE
, не уверен, что это важно).
Я думаю, что Names.bindProperties
не использует bindConstant
только потому, что внутренний код и немного больше кода в порядке, чтобы пропустить шаг или два в процессе создания привязки. В ваших собственных модулях я просто использую bindConstant
, потому что это легко и понятно.
Ответ 2
bindConstant()
имеет преимущество в том, что он может устанавливать разные примитивы из-за предопределенных экземпляров TypeConverter
в самом Guice.
В качестве примера возьмем следующее определение привязки:
bindContant().annotatedWith(@Names.named("c")).to("30");
Затем в классе, где вы хотите выполнить инъекцию:
@Inject @Named("c") int value;
Guice преобразует привязку String
в int
для вас. Если он не может, он это скажет.
Преимущество bindConstant()
- преобразование типа, которое может произойти. Явное привязка int
не дает вам этой роскоши.