我正在将一个servlet应用程序与Guice集成(可能是Spring,我选择Guice只是因为我使用它)。此应用程序广泛使用常量特定方法(数千个枚举)。从服务中,它确定要调用的操作:
ActionEnum act = ActionEnum.valueof("Action from context");
act.perform();
枚举动作如下所示:
public enum ActionEnum {
ACTION1 { perform() {}},
ACTION2 { perform() {}};
abstract void perform();
}
有没有办法通过Guice(或Spring)向枚举类注入一些东西?例如:
public enum ActionEnum {
ACTION1 {
@Inject
SomeClass case1ToBeUsedByAction1;
void perform() {
case1ToBeUsedByAction1.doSomething();
case2ToBeUsedByActionN.doSomething();
}
},
ACTION2 { void perform() { case2ToBeUsedByActionN.doSomething(); }};
abstract void perform();
@Inject SomeClass case2ToBeUsedByActionN;
}
或者如何更改当前代码库以启用注入?
答案 0 :(得分:1)
您可以将类添加为枚举值,如下所示:
public enum TestType {
TEST_TYPE_1("TEST-1", Test1.class),
TEST_TYPE_2("TEST-2", Test2.class),
TEST_TYPE_3("TEST-3", Test3.class),
TEST_TYPE_4("TEST-4", Test4.class),
TEST_TYPE_5("TEST-5", Test5.class);
private final String testType;
private final Class<? extends TestIF> tester;
private <T extends TestIF> TestType(String testType, Class<? extends TestIF> tester) {
this.testType = testType;
this.tester = (Class<tester.TestIF>) tester;
}
public String toString() {
return this.testType;
}
public Class<? extends TestIF> tester() {
return this.tester;
}
然后为每个类实现TestIF并执行注入的类,如下所示:
TestIF tester = Guice.createInjector().getInstance(testType.tester());
tester.perform();
答案 1 :(得分:0)
Java enum
的实例是在编译时创建的。而 guice 创建和管理实例是在运行时动态执行的。
请注意,enum
类型不能具有公共构造函数,这巩固了以下事实:在运行时无法动态创建enum
类型的实例。
或者如何更改当前代码库以启用注入?
-除了使用常规class
类型之外,您无法对此问题进行任何处理。 Guice 无法注入到您的enum类中,因为在运行时本可以创建enum
类型实例的情况下才可以注入。