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,但它不起作用.
也许重写模块可以帮助你.可以使用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)
| 归档时间: |
|
| 查看次数: |
2414 次 |
| 最近记录: |