java - 启动时的 Java 动态枚举
问题描述
例如,我从 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 };
我得到非法的前向引用。
我知道我省略了很多代码,但我认为这个问题很简单。只要我能找到某种方法来动态加载枚举的值,我就可以实现这个解决方案的所有其他事情。
请询问我可能在这里错过的任何信息,谢谢
解决方案
我不知道 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());
}
第二个有一个主要优势,即很容易创建用于单元测试的替代选项。这是我会推荐的。
更好的是:为什么要使用枚举?只需包含一个类 Level,并让它指定其名称(“Easy”等)和设置(1、11 等)。在启动时创建一个列表,然后就可以了。这样一来,当您添加 Epic 关卡设置时,您无需提示要更改的开关。
推荐阅读
- solr - 如何在 Solr 中存储嵌套的关系数据
- python - 使用 Wordpress API 将数据作为图像上传到 Wordpress
- javascript - 无法显示 JavaScript 小部件
- python - 关于 Python 2.7 类、实例和变量范围的基本问题
- javascript - Selenium - 在无头 geckodriver 中禁用 javascript
- javascript - 在 if 条件之后,Javascript 未在 Jupyter 单元中执行
- node.js - 在 iframe 中加载时被 iOS Safari 阻止的身份验证 cookie
- sql - 基于另一个参数的条件 where 子句
- angular - 在移动角度7上滚动时防止关闭工具提示
- python - dill.dump_session 不能与 getpass 一起使用