【发布时间】:2016-12-29 11:57:14
【问题描述】:
我有一个枚举,它将某些类型和每种类型的某些字段放在一起。
public enum Types {
A (1, A.class, "stringA" ),
B (2, B.class, "stringB" ),
C (3, C.class, "stringC" ),
C1(3, C1.class, "stringC" ),
C2(3, C2.class, "stringC" ),
C3(3, C3.class, "stringC" ),
.
.
D (4, D.class, "stringD" ),
E (5, E.class, "stringE" ),
F (6, F.class, "stringF" ),
.
.
.
.
private int type;
private Class<?> className;
private String longname;
private Types(int type, Class<?> className, String longName )
{
this.type = type;
this.className = className;
this.longName = longName;
}
//..... getter, setters
// returns name from type passed
public static Types getName(int type) {
for (Types e : Types.values()) {
if (type == e.type)
return e;
}
return null;
}
}
现在一切都很好,直到没有重复的类型键。所以TypeC 具有子类型C1, C2..,因此具有与3 相同的类型值。
它有一个方法getName(),它通过迭代枚举的values 来给出类型。
现在C1, C2, C3... 都映射到相同的类型值 3。
现在为了区分 C 类型,我有另一个变量名称 definition 仅用于 C 子类型。所以definition 的值是:
C1 100
C2 101
C3 101
所以要检索类型 C 的枚举的唯一元素,我需要两个值 type 和 definition。
我想到了两种方法:
要么为整个枚举添加一个名为 definition 的新字段,因此这将导致除 C 之外的其他类型为空值。
或者为 C 子类型创建一个新枚举并使用该枚举来获取 C 子类型名称,而不是从 getName() 获取。
如何以最好的方式实现这一目标?
感谢任何帮助。
【问题讨论】:
-
我建议你用你的定义字段替换类型字段,让 A 有 100,B 有 200,等等,因为你可能想要 A1、A2、G7、Z9 - 好吧,不是真的,但是为了可扩展性,完全用定义替换类型总是更好,除非你正在升级一个广泛使用的库。
-
我建议您将方法重命名为“Types getName(int type)”。您能否添加一些 javadoc,以便我们了解该方法的作用?是不是类似于“Types getByTypeKey(int typeKey)”?
-
@TobiasOtto:是的,它是
getByTypeKey(int typeKey)。 1-->A型,2-->B型,3-->C型