【发布时间】:2019-12-21 12:27:30
【问题描述】:
在我正在处理的 Java 应用程序中,我有许多枚举,它们最终在其中包含一个静态 fromString 方法,用于将字符串转换为其实际枚举值。
所以,我想我可以有一个“基”类,我的所有枚举都可以从中扩展,而不必一直重复该代码。由于枚举不能扩展类,我计划做的是我可以通过接口来做到这一点。
我拥有的是以下内容:
public interface IBaseEnum {
String enumVal = null;
public static <T extends Enum<T> & IBaseEnum> Enum<T> fromString(String strVal) {
if (strVal == null) return null;
// T.values() has error because T is not recognised to have the method values()
for (T myEnum : T.values()) {
if (myEnum.enumVal.equals(strVal.toUpperCase())) {
return myEnum;
}
}
return null;
}
}
然后,为了继承该静态方法,我将在我的实际 Enum 中实现 IBaseEnum:
public enum Colour implements IBaseEnum {
Red("red");
//...
}
但是,IBaseEnum 中的类型存在问题。 T.values() 行有错误,因为泛型类型 T 无法引用回枚举本身,因此它抱怨找不到方法 values()。
这是继承枚举功能的正确方法吗?否则,我如何继承枚举中的方法,这样我就不必在每个枚举中复制/粘贴和重复相同的一组方法?
【问题讨论】:
-
我最初的想法是,您想要实现的目标将导致“滥用”枚举。如果要使用继承,请使用类。如果要将类型抽象为“值列表”,请使用枚举。顺便说一句,您正在寻找的方法不是 .valueOf() 吗? (另见:howtodoinjava.com/java/enum/enum-tutorial)