打破一个大的Java枚举

时间:2011-12-29 17:26:46

标签: java enums

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

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

你可以将它们分解为:

import java.util.*;
interface Children {
    Set<Enum<?>> children();
}
enum Dog implements Children {
    myDog,yourDog;
    Dog() {
        this(null);
    }
    Dog(Set<Enum<?>> children) {
        this.children=children;
    }
    @Override public Set<Enum<?>> children() {
        return children!=null?Collections.unmodifiableSet(children):null;
    }
    Set<Enum<?>> children;
}
enum Animal implements Children {
    cat,dog(EnumSet.allOf(Dog.class));
    Animal() {
        this(null);
    }
    Animal(Set children) {
        this.children=children;
    }
    @Override public Set<Enum<?>> children() {
        return children!=null?Collections.unmodifiableSet(children):null;
    }
    Set<Enum<?>> children;
}
enum Thing implements Children {
    animal(EnumSet.allOf(Animal.class)),vegetable,mineral;
    Thing() {
        this(null);
    }
    Thing(Set children) {
        this.children=children;
    }
    @Override public Set<Enum<?>> children() {
        return children!=null?Collections.unmodifiableSet(children):null;
    }
    Set<Enum<?>> 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);
    }
}

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

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