如何为Guice指定默认的Enum实例?

时间:2011-03-02 17:09:51

标签: java enums default guice

我需要像

这样的东西
@DefaultInstance(Level.NORMAL)
enum Level {NORMAL, FANCY, DEBUGGING}

这将使Guice返回Level.NORMAL表达式

injector.getInstance(Level.class)

没有@DefaultInstance之类的东西。作为一种解决方法,我尝试@ProvidedBy使用了一个简单的Provider,但它不起作用。

3 个答案:

答案 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,看起来像一个非常微不足道的错误。

我已经为自己打补丁了,也许有一天,有人会解决这个非常古老的问题。