Совет: разница между Binder # bindConstant () и Binder # bind () ... toInstance - PullRequest
14 голосов
/ 12 ноября 2010

Я хотел бы спросить, в чем разница между

bindConstant().annotatedWith(Names.named("keepAliveInterval")).to(60);

и

bind(Integer.TYPE).annotatedWith(Names.named("keepAliveInterval")).toInstance(60);

Я хотел бы загрузить все свои свойства конфигурации с помощью Names.bindProperties (binder (), prop); в моем модуле, и я обнаружил, что он использует последний для связывания свойств.

Спасибо, с уважением

Marek

Ответы [ 2 ]

10 голосов
/ 12 ноября 2010

Я думаю, что причинами использования bindConstant() являются:

  • Требуется использование аннотированной привязки. Вы не можете сделать bindConstant().to(foo). Поскольку типы, которые вы связываете с ним, являются примитивами и String s, маловероятно, чтобы привязка без аннотаций имела бы смысл для любого из них.
  • Это требует меньше усилий, так как вам не нужно указывать тип (кстати, bindConstant() связывает int с Integer.class, а не Integer.TYPE, не уверен, имеет ли это значение).

Я думаю, Names.bindProperties не использует bindConstant только потому, что это внутренний код, и немного больше кода в порядке, чтобы пропустить шаг или два в процессе создания привязки. В ваших собственных модулях я бы просто использовал bindConstant, потому что это просто и понятно.

3 голосов
/ 13 ноября 2010

bindConstant() имеет возможность устанавливать различные примитивы из-за предопределенных экземпляров TypeConverter внутри самого Guice.

В качестве примера взять следующее определение привязки:

bindContant().annotatedWith(@Names.named("c")).to("30");

Затем в классе, где вы хотите сделать инъекцию:

@Inject @Named("c") int value;

Guice преобразует границу String в int для вас.Если это невозможно, он скажет так.

Преимущество bindConstant() заключается в том, что может произойти преобразование типов.Явное связывание int не дает вам такой роскоши.

...