首页 > 解决方案 > 启动时的 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 }; 我得到非法的前向引用。

我知道我省略了很多代码,但我认为这个问题很简单。只要我能找到某种方法来动态加载枚举的值,我就可以实现这个解决方案的所有其他事情。

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

标签: javaspring-bootenums

解决方案


我不知道 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 关卡设置时,您无需提示要更改的开关。


推荐阅读