Java 如何继承功能以减少枚举中的重复代码?
在我正在处理的一个Java应用程序中,我有许多枚举,这些枚举中有一个静态的Java 如何继承功能以减少枚举中的重复代码?,java,enums,Java,Enums,在我正在处理的一个Java应用程序中,我有许多枚举,这些枚举中有一个静态的fromString方法,用于将字符串转换为实际的枚举值 所以,我想我可以有一个“基类”,我所有的枚举都可以从中扩展,而不必一直重复代码。因为枚举不能扩展类,所以我计划做的是,我可以通过接口来实现 我所知道的是: public interface IBaseEnum { String enumVal = null; public static <T extends Enum<T> &a
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 Colour implements IBaseEnum {
VAL1("string")
;
private final String val;
Colour(String v) {
this.val = v;
}
@Override
public String enumVal() {
return this.val;
}
public static Colour fromString(String s) {
return IBaseEnum.fromString(s, values());
}
}
但是,IBaseEnum
中的类型有问题。行T.values()
有错误,因为泛型类型T
无法引用回枚举本身,因此它抱怨找不到方法values()
这是在enum中继承功能的正确方法吗?否则,我如何在枚举中继承方法,以便不必在每个枚举中复制/粘贴和重复相同的方法集?您的代码无法工作有几个原因,我应该提到:
String enumVal=null代码>:
作为一个接口,IBaseEnum
获取隐式numVal
、公共
和静态
修饰符。但是,您希望最终
成为实例属性enumVal
:当然这不会编译。但是,即使它可以(或者您拥有类实例),您仍然无法使其成为动态的。静态方法是在编译时选择的。使其动态工作的唯一方法(我知道)是使用反射,当然是传入枚举的类对象T.values()
Color.fromString(…)
,所以您别无选择,只能在每个枚举类中将其声明为静态方法。话虽如此,我认为从逻辑中可以重用的最多的是查找代码(同样,除非使用反射)
要重用查找逻辑,可以更改IBaseEnum
的约定,使其声明一个返回enumVal
值的方法。除此之外,枚举类本身还可以调用values()
方法。下面是它的外观:
interface IBaseEnum {
String enumVal();
public static <T extends Enum<T> & IBaseEnum> T
fromString(String strVal, T[] values) {
if (strVal == null)
return null;
for (T myEnum : values) {
if (myEnum.enumVal().equalsIgnoreCase(strVal)) {
return myEnum;
}
}
return null;
}
}
请记住:如果
enumVal()
仅用于返回枚举文字,那么您可以通过使用所有枚举中可用的valueOf
方法来消除所有这些复杂性。只有在值的比较需要自定义逻辑时才执行此操作。我最初的想法是,您想要实现的目标将导致“误用”枚举。如果要使用继承,请使用类。如果要将类型抽象为“valuelist”,请使用枚举。顺便问一下,.valueOf()不是您正在搜索的方法吗?(另见:)
enum Colour implements IBaseEnum {
VAL1("string")
;
private final String val;
Colour(String v) {
this.val = v;
}
@Override
public String enumVal() {
return this.val;
}
public static Colour fromString(String s) {
return IBaseEnum.fromString(s, values());
}
}