您的声明结构非常聪明,这很遗憾,无法正常工作。但是
EnumSet显然需要先对枚举进行完全初始化。它尝试从枚举中获取常量数组,以便除其他外,它知道其内部位集需要多少空间。
这是一种解决方法。它使用一个助手方法,该方法首先创建一个普通的set(
HashSet),然后在静态初始化块中迭代枚举常量,并用
EnumSets
替换所有这些set 。
public enum BuildingTechTree { // Named constants //NameSoftName Requirements NONE ("NULL", null), BARRACKS ("Barracks", setOf(NONE)), WALLS_SANDBAGS ("Sandbag wall", setOf(NONE)), POWERPLANT ("Power plant", setOf(BARRACKS)), GUARDTOWER ("Guard Tower", setOf(BARRACKS)); private final String softName; private Set<BuildingTechTree> requirements; private BuildingTechTree(String softName, Set<BuildingTechTree> requirements) { this.softName = softName; this.requirements = requirements; } private static Set<BuildingTechTree> setOf(BuildingTechTree... values) { return new HashSet<>(Arrays.asList(values)); } static { for (BuildingTechTree v : values()) { if (v.requirements == null) { v.requirements = EnumSet.noneOf(BuildingTechTree.class); } else { v.requirements = EnumSet.copyOf(v.requirements); } } }}


