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 не дает вам этой роскоши.