我试图把一个枚举放入ginjector与这些代码行:
ClientGinjector.java
MyEnum getMyEnum();
ClientModule.java
bind(MyEnum.class).in(Singleton.class);
但是当我试图编译时,我得到以下错误:
有谁能帮帮我吗?[ERROR]注入bla.blup.MyEnum错误:无法创建或继承binding:请求绑定常量键bla.blup。MyEnum'但是没有发现显式绑定
一个常量(基本类型,String, Class或enum)必须在GinModule中显式绑定(使用bindConstant()或bind())(因为没有合理的默认值可以让GIN注入)。
这就是GIN告诉你的。
该文件是请求绑定的位置(即声明依赖项的位置),而GIN无法执行。
不能构造枚举类,它的唯一有效实例是枚举值。这意味着你必须绑定一个特定的枚举值,该值将被注入到该枚举类型的任何字段或参数中。
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,它没有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一起使用。