如何使用枚举进行分类



我使用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>>

还有别的办法吗?

假设Type和Subtype基础结构是常量,则可以始终将Subtypes列表附加到Type枚举。

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;
}
}

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

顺便说一句,最好使用Arrays.asList((之类的东西来定义这些映射,以确保"subtypes"列表是不可变的。

一种方法是扩展父枚举,如下所示:

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

这里有很多选项:

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

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

  3. 将"owner"类型与子类型一起存储。

    枚举子类型{子类型1(类型1(、子类型2(类型1、子类型3(类型2(。。。

    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;
    }
    

    }

最新更新