【发布时间】:2018-02-16 16:02:25
【问题描述】:
我有一系列类似这样的枚举,只是名称和值不同:
/* Bone Diagnosis. Value is internal code stored in database. */
public enum BoneDiagnosis {
NORMAL(121),
ELEVATED(207),
OSTEOPENIA(314),
OSTEOPOROSIS(315);
private int value;
BoneDiagnosis(final int value) {
this.value = value;
}
/** Get localized text for the enumeration. */
public String getText() {
return MainProgram.localize(this.getClass().getSimpleName().toUpperCase() + ".VALUE." + this.name());
}
/** Convert enumeration to predetermined database value. */
public int toDB() {
return value;
}
/** Convert a value read from the database back into an enumeration. */
public static BoneDiagnosis fromDB(final Integer v) {
if (v != null) {
for (final BoneDiagnosis pc : values()) {
if (v == pc.toDB()) {
return pc;
}
}
}
return null;
}
}
我知道我不能扩展枚举,但是有什么方法可以抽象出这个设计来删除每个类都有的 toDB()、fromDB() 和 getText() 中的所有重复代码?我查看了其他问题,例如Is it possible to extend enum in Java 8?,其中有一个使用接口的示例,但我不知道如何处理构造函数和静态方法。我也无法弄清楚如何在 fromDB() 方法中删除对 BoneDiagnosis 类型的显式引用。
我的梦想是让每个类只定义如下内容,而所有其他支持都包含在 BoneDiagnosisComplexTypeDefinition 中。这可能吗?
public enum BoneDiagnosisComplexTypeDefinition {
NORMAL(121),
ELEVATED(207);
OSTEOPENIA(314),
OSTEOPOROSIS(315)
}
【问题讨论】:
-
“组合优于继承”。创建一个
EnumIndexTransformer类,您可以将其组合到您的enum中,然后委托给它。你的Enum也可以是implements和interface- 有一个Indexable<I>来公开这些方法。 -
您的代码将无法编译。这 ;必须在 OSTEOPOROSIS 之后而不是在 ELEVATED 之后
-
@DwB 抱歉,我在修改代码以保护无辜者和客户时引入了一个错字
-
我建议如果你有一个广泛的枚举层次结构,一个更好的模式可能是创建一个具有你需要的任何层次行为的实体层次结构,并将值存储在一个持久存储中。