打破一个大的Java枚举

采用具有1300个值并将其放入有组织组的Java枚举的建议做法是什么? 我知道你不能只扩展枚举组,那么还有其他好的选择吗?

我会使用这些实例共享的接口,然后您可以使用任意数量的枚举或从其他数据源(如文件或数据库)加载它们。

你可以把它们分解成:

import java.util.*; interface Children { Set> children(); } enum Dog implements Children { myDog,yourDog; Dog() { this(null); } Dog(Set> children) { this.children=children; } @Override public Set> children() { return children!=null?Collections.unmodifiableSet(children):null; } Set> children; } enum Animal implements Children { cat,dog(EnumSet.allOf(Dog.class)); Animal() { this(null); } Animal(Set children) { this.children=children; } @Override public Set> children() { return children!=null?Collections.unmodifiableSet(children):null; } Set> children; } enum Thing implements Children { animal(EnumSet.allOf(Animal.class)),vegetable,mineral; Thing() { this(null); } Thing(Set children) { this.children=children; } @Override public Set> children() { return children!=null?Collections.unmodifiableSet(children):null; } Set> children; } public class So8671088 { static void visit(Class clazz) { Object[] enumConstants = clazz.getEnumConstants(); if (enumConstants[0] instanceof Children) for (Object o : enumConstants) visit((Children) o, clazz.getName()); } static void visit(Children children, String prefix) { if (children instanceof Enum) { System.out.println(prefix + ' ' + children); if (children.children() != null) for (Object o : children.children()) visit((Children) o, prefix + ' ' + children); } else System.out.println("other " + children.getClass()); } public static void main(String[] args) { visit(Thing.animal," "); visit(Thing.class); } } 

1300个值? 好神,谁认为这是个好主意? 100岁以后的人不会发生太大的事吗?

我能看到它周围没有好办法。 得到一把铲子,开始将它们组合成更具凝聚力的子枚举。

这是一个问题:它们是如何使用的? 如果它们是您的应用程序配置的一部分,我建议将它们移动到数据库而不是将它们保存在代码中。 他们会以这种方式更加灵活。

从oops的角度来看,将它们分解为有凝聚力的单元是个好主意。 所以,如果我是你,我会评估这些枚举中哪一个具有凝聚力。