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

maa*_*nus 3 java enums default guice

我需要类似的东西

@DefaultInstance(Level.NORMAL)
enum Level {NORMAL, FANCY, DEBUGGING}
Run Code Online (Sandbox Code Playgroud)

这将使Guice回归Level.NORMAL表达

injector.getInstance(Level.class)
Run Code Online (Sandbox Code Playgroud)

没有这样的事情@DefaultInstance.作为一种解决方法,我尝试@ProvidedBy了一个微不足道的Provider,但它不起作用.

Bor*_*vić 5

也许重写模块可以帮助你.可以使用AppLevel模块配置默认级别:

public class AppModule extends AbstractModule {
    @Override
    public void configure() {
        bind(Level.class).toInstance(Level.NORMAL);
        // other bindings
    }
}
Run Code Online (Sandbox Code Playgroud)

并且可以在小的覆盖模块中配置特定的一个:

public class FancyLevelModule extends AbstractModule {
    @Override
    public void configure() {
        bind(Level.class).toInstance(Level.FANCY);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,只需创建一个覆盖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));
}
Run Code Online (Sandbox Code Playgroud)

UPDATE

这个问题可以用稍微不同的方式解决.假设Level在类中用作注入字段:

class Some
{
  @Injected(optional = true)
  private Level level = Level.NORMAL;
}
Run Code Online (Sandbox Code Playgroud)

默认级别将初始化为创建实例的一部分Some.如果一些Guice配置模块声明了某个其他级别,它将被选择性地注入.


小智 5

一个解决方案,但不幸的是不使用注释,将是:

enum Level 
{
    NORMAL, FANCY, DEBUGGING;

    static final Level defaultLevel = FANCY; //put your default here
}
Run Code Online (Sandbox Code Playgroud)

然后像这样定义模块:

public class DefaultLevelModule extends AbstractModule 
{
    @Override public void configure() 
    {
        bind(Level.class).toInstance(Level.defaultLevel);
    }
}
Run Code Online (Sandbox Code Playgroud)