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); в моем модуле, и я обнаружил, что он использует последний для привязки свойств.

С уважением

Марек


person zeratul021    schedule 12.11.2010    source источник
comment
+1 Как раз думал сделать что-то подобное.   -  person Jeremy    schedule 12.11.2010


Ответы (2)


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

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

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

person ColinD    schedule 12.11.2010

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

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

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

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

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

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

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

person gpampara    schedule 13.11.2010
comment
Как видно из того, что bindProperties() не использует bindConstant(), это не совсем так. Использование bind(String.class) ... .toInstance("30") прекрасно работает и позволяет преобразовать привязку в int так же, как bindConstant(). Я не думаю, что TypeConverter заботит то, как вы сделали привязку с самого начала. - person ColinD; 13.11.2010
comment
Ну, на самом деле, как я упоминал в своем OP, Names.bindProperties не использует bindConstant, и тем не менее происходит преобразование типов (например, хост и порт - это String и int, и они оба правильно вводятся как типы, которыми они являются - без ошибок преобразования) - person zeratul021; 13.11.2010
comment
Правда, это не так. Однако с точки зрения пользователя это следует учитывать, поскольку это внутренняя логика Guice. - person gpampara; 15.11.2010