如何用枚举分类

时间:2018-07-20 02:40:11

标签: java data-structures enums

我用enum表示类型和子类型。

enum Type {

    TYPE1(1),

    TYPE2(2),
    ...

    private int constant;

    Type(int constant) {
        this.constant = constant;
    }
}

enum SubType {

    SUBTYPE1(1),

    SUBTYPE2(2),

    SUBTYPE3(3),
    ...

    private int constant;

    SubType(int constant) {
        this.constant = constant;
    }
}

每种类型都有不同的子类型。

例如,TYPE1具有子类型SUBTYPE1和SUBTYPE2,TYPE2具有子类型SUBTYPE2和SUBTYPE3。

我应该使用什么结构来表示这种关系? 我想到了使用地图。例如Map<Type, List<SubType>>

还有其他方法吗?

3 个答案:

答案 0 :(得分:3)

假设“类型”和“子类型”基础结构是恒定的,则始终可以将“子类型”列表附加到“类型”枚举中。

enum Type {

    TYPE1(1, Arrays.asList(SubType.SUBTYPE1, SubType.SUBTYPE2)),

    TYPE2(2, Arrays.asList(SubType.SUBTYPE3),
    ...

    private int constant;
    public final List<SubType> subtypes;

    Type(int constant, List<SubType> subtypes) {
        this.constant = constant;
        this.subtypes = subtypes;
    }
}

enum SubType {

    SUBTYPE1(1),

    SUBTYPE2(2),

    SUBTYPE3(3),
    ...

    private int constant;

    SubType(int constant) {
        this.constant = constant;
    }
}

这可能会提供一种更优雅的方式来访问Type的子类型。

作为旁注,最好使用Arrays.asList()之类的内容来定义这些映射,以确保“子类型”列表不可变。

答案 1 :(得分:0)

一种方法是扩展您的父母枚举,例如:

public interface Type1{
    enum SubType1 implements Type1 {
    }
    enum SubType2 implements Type1{
    }
}

public interface Type2{
    enum SubType1 implements Type2 {
    }
    enum SubType2 implements Type2{
    }
}

答案 2 :(得分:0)

您在这里有很多选择:

  1. 您可以按照自己的意愿使用地图。理想情况下,这将是EnumMap<Type,List<Subtype>>,以利用EnumMap的效率。

  2. 明确地使检索子类型成为类型的方法。那将意味着向枚举添加一个方法(例如Stream<Subtype> getSubtypes()),每种类型都将覆盖该方法。

  3. 将“所有者”类型与子类型一起存储。

    枚举子类型{     SUBTYPE1(TYPE1),SUBTYPE2(TYPE1),SUBTYPE3(TYPE2)...

    private final Type parent;
    
    public static Stream<Subtype> getSubtypes(Type type) {
        return Arrays.stream(values()).filter(st -> st.parent.equals(type));
    }
    
    private Subtype(Type parent) {
        this.parent = parent;
    }
    

    }