将一个大的Java枚举拆分

5

如何将具有1300个值的Java枚举放入组织化的组中? 推荐的做法是什么? 我知道无法扩展枚举组,那么是否有其他好的替代方案?

4个回答

7

我会使用一个共享的接口,所有这些实例都可以使用它,这样你就可以使用任意数量的枚举或从其他数据源(如文件或数据库)加载它们。


我完全同意。从文件或数据库中加载它们。但是,如果在一些枚举中有方法实现,请考虑创建一个接口,并为每个定义了方法的枚举创建单独的实现,然后创建一个默认实现,从数据库或文件中接收值。如果没有定义方法,则只需创建一个POJO。 - Saish

5

1300个数值?天哪,谁认为这是个好主意?第100个之后就不会有人想到它变得太大了吗?

我看没有更好的解决办法。拿铲子开始将它们合并成更具连贯性的子枚举。

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


2
它们实际上已经在数据库中了。这些枚举是错误代码列表的主键。例如,'NO_DATA_FOUND' 枚举键指向数据库中的 '抱歉,但我们无法找到您的请求'。 - yd39

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

从 oops 的角度来看,将它们分成具有内聚性的单元是一个好主意。所以如果我是你,我会评估这些枚举中哪些对某个职责具有内聚性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接