【发布时间】:2017-03-08 00:23:52
【问题描述】:
我有多个 Enum 共享它们之间的方法。如果可能的话,我想把它移到一个界面上,这样我就不必复制它了,代码看起来会更干净。但是经过很多努力,我仍然无法将方法移动到接口。
public enum TypeA {
ValueAA ("Value AA"),
ValueAB ("Value AB");
private final String type;
TypeA (final String type) {
this.type = type;
}
@JsonValue
public String getType() {
return this.type;
}
@JsonCreator
public static TypeA fromValue(final String value) {
for (TypeA t : TypeA.values()) {
if (t.getType().equalsIgnoreCase(value)) {
return t;
}
}
StringBuilder allTypes = new StringBuilder();
boolean bFirstTime = true;
for (TypeA val : TypeA.values()) {
allTypes.append(bFirstTime ? "" : ", ").append(val);
bFirstTime = false;
}
throw new IllegalArgumentException(value + " is an invalid value. Supported values are " + allTypes);
}
}
public enum TypeB {
ValueBA ("Value BA"),
ValueBB ("Value BB");
private final String type;
TypeB (final String type) {
this.type = type;
}
@JsonValue
public String getType() {
return this.type;
}
@JsonCreator
public static TypeB fromValue(final String value) {
for (TypeB t : TypeB.values()) {
if (t.getType().equalsIgnoreCase(value)) {
return t;
}
}
StringBuilder allTypes = new StringBuilder();
boolean bFirstTime = true;
for (TypeB val : TypeB.values()) {
allTypes.append(bFirstTime ? "" : ", ").append(val);
bFirstTime = false;
}
throw new IllegalArgumentException(value + " is an invalid value. Supported values are " + allTypes);
}
}
使用泛型和 Java 8 是否可以将 getType 和 fromValue 方法移动到接口,以便我可以在所有 Enums 之间共享?另请注意 Jackson 注释 JsonValue 和 JsonCreator。
【问题讨论】:
-
您实际上需要状态,而状态需要类。枚举类型不能是您自己的类的子类型。
-
感谢您的简单解释
-
您可以创建一个辅助类来保存状态并在其他类之间共享一个实例。然而,枚举似乎不是你想要的。您可以滚动自己的类型安全枚举并为它们提供通用代码,或者更好的是,创建一个状态维护类,该类包含所需的状态并保存枚举值。目前还不清楚什么最适合您,因为您的示例没有暗示您为什么需要枚举,更不用说两种共享状态的类型了。从表面上看,您可能不会,而是应该重新考虑您的模型。
-
@Sotirios Delimanolis:这种状态是不变的,接口支持常量。因此,在这种特定情况下,这是可能的。但我会在
enum类型中保留getType方法。
标签: java generics enums java-8