我使用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{
}
}
这里有很多选项:
-
您可以按照自己的意愿使用地图。理想情况下,这将是
EnumMap<Type,List<Subtype>>
以利用EnumMap
的效率。 -
显式地使检索子类型成为类型的方法。这意味着向枚举中添加一个方法(例如
Stream<Subtype> getSubtypes()
(,该方法对每种类型都被覆盖。 -
将"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; }
}