我需要像
这样的东西@DefaultInstance(Level.NORMAL)
enum Level {NORMAL, FANCY, DEBUGGING}
这将使Guice返回Level.NORMAL
表达式
injector.getInstance(Level.class)
没有@DefaultInstance
之类的东西。作为一种解决方法,我尝试@ProvidedBy
使用了一个简单的Provider
,但它不起作用。
答案 0 :(得分:5)
也许覆盖模块可以帮助你。可以使用AppLevel
模块配置默认级别:
public class AppModule extends AbstractModule {
@Override
public void configure() {
bind(Level.class).toInstance(Level.NORMAL);
// other bindings
}
}
可以在一个小的覆盖模块中配置特定的一个:
public class FancyLevelModule extends AbstractModule {
@Override
public void configure() {
bind(Level.class).toInstance(Level.FANCY);
}
}
最后,只需使用特定AppModule
配置创建一个覆盖Level
的注射器:
public static void main(String[] args) {
Injector injector =
Guice.createInjector(
Modules.override(new AppModule()).with(new FancyLevelModule())
);
System.out.println("level = " + injector.getInstance(Level.class));
}
<强>更新强>
这个问题可以用不同的方式解决。假设Level
在类中用作注入字段:
class Some
{
@Injected(optional = true)
private Level level = Level.NORMAL;
}
默认级别将作为创建Some
实例的一部分进行初始化。如果某些Guice配置模块声明了某个其他级别,它将被选择性地注入。
答案 1 :(得分:4)
解决方案,但不幸的是不使用注释,将是:
enum Level
{
NORMAL, FANCY, DEBUGGING;
static final Level defaultLevel = FANCY; //put your default here
}
然后像这样定义模块:
public class DefaultLevelModule extends AbstractModule
{
@Override public void configure()
{
bind(Level.class).toInstance(Level.defaultLevel);
}
}
答案 2 :(得分:0)
它是the issue 295,看起来像一个非常微不足道的错误。
我已经为自己打补丁了,也许有一天,有人会解决这个非常古老的问题。