我用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>>
还有其他方法吗?
答案 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)
您在这里有很多选择:
您可以按照自己的意愿使用地图。理想情况下,这将是EnumMap<Type,List<Subtype>>
,以利用EnumMap
的效率。
明确地使检索子类型成为类型的方法。那将意味着向枚举添加一个方法(例如Stream<Subtype> getSubtypes()
),每种类型都将覆盖该方法。
将“所有者”类型与子类型一起存储。
枚举子类型{ 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;
}
}