Класс enum не может быть сконструирован, его единственными действительными экземплярами являются его значения перечисления. Это означает, что вам нужно привязать определенное значение перечисления, которое будет введено в любое поле или параметр этого типа перечисления.
Guice/GIN рекомендует использовать обязательные аннотации для констант, поэтому вы можете вводить разные постоянные значения в зависимости от контекста; например
@Named("foo") @Inject MyEnum myEnum;
–
bindConstant().annotatedWith(Names.named("foo")).to(MyEnum.FOO);
Если вы не хотите использовать связывающую аннотацию (потому что вы знаете, вы будете только когда-либо хотите одно значение перечисления на протяжении всего приложения), вы не можете использовать bindConstant()
, но вы можете использовать toInstance
:
@Inject MyEnum myEnum;
…
bind(MyEnum.class).toInstance(MyEnum.FOO);
Это будет работать только в Guice, но не в GIN, который doesn't have toInstance
. В GIN, вы должны использовать Provider
класс или метод @Provides
:
class MyEnumProvider implements Provider<MyEnum> {
@Override
public MyEnum get() {
return MyEnum.FOO;
}
}
…
bind(MyEnum.class).toProvider(MyEnumProvider.class);
или
@Provides
MyEnum provideMyEnum() {
return MyEnum.FOO;
}
Оба подхода выше будет также работать с Guice.
Благодарим вас за разъяснения. Моя учетная запись будет соответствовать вашей второй альтернативе без аннотации. Но у меня нет метода «toInstance» на «bind (...)». Возможно, это потому, что мой «ClientModule» является расширением «AbstractPresenterModule» (GWTP). – Ben
Aw snap! Мой плохой, 'toInstance' не находится в GIN, только в Guice. В GIN вы должны использовать метод 'Provider' или' @ Provides'. Ответ обновлен. –