我需要类似的东西
@DefaultInstance(Level.NORMAL)
enum Level {NORMAL, FANCY, DEBUGGING}
这将使 Guice 为表达式返回 Level.NORMAL
injector.getInstance(Level.class)
没有像@DefaultInstance
这样的东西。作为一种解决方法,我已经尝试使用 @ProvidedBy
和一个普通的 Provider
,但它不起作用。
最佳答案
也许覆盖模块可以帮助你。可以使用 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);
}
}
最后只需创建一个注入(inject)器,用特定的 Level
配置覆盖 AppModule
:
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
在类中用作注入(inject)字段:
class Some
{
@Injected(optional = true)
private Level level = Level.NORMAL;
}
默认关卡将作为 Some
实例创建的一部分进行初始化。如果一些 Guice 配置模块声明了一些其他级别,它将被选择性地注入(inject)。
关于java - 如何为 Guice 指定默认的枚举实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170910/