Sto*_*oud 4 java enums spring dependency-injection
我遇到的情况是,我的应用程序可能处于多种“模式”中的一种。由于这些是离散值,我想使用枚举类型对它们进行建模。
对于每种状态,我的应用程序都需要执行稍微不同的功能,我想使用插件模式对其进行建模。我定义了一个接口并提供了一些实现。
我现在希望我的枚举返回适合其状态的插件。我想做以下事情:
public enum Mode {
ONE {
@Override
public MyType get() { return factory.getFirst(); }
},
TWO {
@Override
public MyType get() { return factory.getSecond(); }
};
@Autowired private MyTypeFactory factory;
public abstract MyType get();
// Other methods removed for clarity
}
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。这是因为我使用 spring 注入将插件工厂添加到枚举中(枚举常量是静态的,spring 注入的变量是实例变量,所以我会收到编译错误)
我无法直接从枚举创建 MyType 实例,因为它们需要依赖项注入
我该如何解决这个问题?
这可能不是最好的解决方案(我很乐意看到更好的建议),但这就是我最终所做的:
修改工厂,使其内容如下:
public class MyTypeFactory {
private static MyTypeFactory me;
@PostConstruct
public void initialise() {
if (me == null) {
me = this;
}
}
public static MyTypeFactory getInstance() {
return me;
}
// The same code as before - getFirst(), getSecond() etc
}
Run Code Online (Sandbox Code Playgroud)
所以,一个(单例)Spring 管理的 bean 看起来有点像旧的 GOF 单例!重要的区别是有一个可公开访问的默认(无参数)构造函数
然后我可以修改我的枚举以读取:
public enum Mode {
ONE {
@Override
public MyType get() { Factory.getInstance().getFirst(); }
},
TWO {
@Override
public MyType get() { Factory.getInstance().getSecond(); }
};
public abstract MyType get();
// Other methods removed for clarity
}
Run Code Online (Sandbox Code Playgroud)
当调用 get() 时,枚举可以通过静态 getInstance 方法访问工厂