启动时的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 }; 我得到非法的前向参考。

我知道我省略了很多代码,但是我认为问题很简单。 只要我有办法动态加载枚举的值,我就可以隐含该解决方案的所有其他内容。

请询问我在这里可能错过的任何信息,谢谢

yu8023fei 回答:启动时的Java动态枚举

我不了解Spring方面,但是通常有两种方法可以处理此问题。

一种方法是拥有枚举的构造函数,您可以显式编写该构造​​函数,查找配置选项:

public enum Level {
    HIGH,MEDIUM,LOW;

    private final int whatever;

    Level() {
        this.whatever = someCodeToLoadFromConfig(name());
    }
}

第二个是完全不在枚举中包含这些值,而是保留您想要的选项的EnumMap:

public enum Level {
    HIGH,LOW,}

EnumMap<Level,LevelSettings> levels = new EnumMap<>(Level.class);
for (Level level : Level.values()) {
    levels.put(level,someCodeToLoadFromConfig(level.name());
}

第二个优点是,创建用于单元测试的替代选项很容易。这就是我的建议。

更好的选择:为什么要使用枚举?只需包含一个级别,然后指定其名称(“ Easy”等)和设置(1、11等)即可。在启动时创建这些列表,然后就可以了。这样,您在添加Epic级别设置时无需提示更改开关。

,

即使您可以执行此操作,也不应这样做。如果您需要一些从启动属性中获取的列表,最好使用该枚举作为键并以加载的列表作为值来创建映射。然后将此地图放在正确的上下文中并使用。

本文链接:https://www.f2er.com/3158964.html

大家都在问