出于示例目的,我从jenkov那里窃取了以下枚举。
public enum Level {
HIGH (3, 33, 333),
MEDIUM(2, 22, 222),
LOW (1, 11, 111);
}
因此几乎没有数字可以导致相同的枚举类型,因此1和11都将返回LOW。 我已经暗示了这一点。
实际问题是,枚举值(如 1、11、111 那样的值)可以动态吗? 似乎这里需要的列表会随着时间而变化,最好的解决方案是在启动时加载新列表。
所以理想的解决方案应该是
public enum Level {
HIGH (listHigh),
MEDIUM(listMedium),
LOW (listLow);
}
这些列表将在启动时由@Configuration @Bean
但是枚举是静态的,即使使用static int array[] = { 1, 2, 3, 4, 5 };
我得到非法的前向参考。
我知道我省略了很多代码,但是我认为问题很简单。 只要我有办法动态加载枚举的值,我就可以隐含该解决方案的所有其他内容。
请询问我在这里可能错过的任何信息,谢谢
答案 0 :(得分:3)
我不了解Spring方面,但是通常有两种方法可以处理此问题。
一种方法是拥有枚举的构造函数,您可以显式编写该构造函数,查找配置选项:
public enum Level {
HIGH,
MEDIUM,
LOW;
private final int whatever;
Level() {
this.whatever = someCodeToLoadFromConfig(name());
}
}
第二个是完全不在枚举中包含这些值,而是保留您想要的选项的EnumMap:
public enum Level {
HIGH,
MEDIUM,
LOW,
}
EnumMap<Level, LevelSettings> levels = new EnumMap<>(Level.class);
for (Level level : Level.values()) {
levels.put(level, someCodeToLoadFromConfig(level.name());
}
第二个优点是,创建用于单元测试的替代选项很容易。这就是我的建议。
更好的选择:为什么要使用枚举?只需包含一个级别,然后指定其名称(“ Easy”等)和设置(1、11等)即可。在启动时创建这些列表,然后就可以了。这样,您在添加Epic级别设置时无需提示更改开关。
答案 1 :(得分:1)
即使您可以执行此操作,也不应这样做。如果您需要一些从启动属性中获取的列表,最好使用该枚举作为键并以加载的列表作为值来创建映射。然后将此地图放在正确的上下文中并使用。