Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何继承功能以减少枚举中的重复代码?_Java_Enums - Fatal编程技术网

Java 如何继承功能以减少枚举中的重复代码?

Java 如何继承功能以减少枚举中的重复代码?,java,enums,Java,Enums,在我正在处理的一个Java应用程序中,我有许多枚举,这些枚举中有一个静态的fromString方法,用于将字符串转换为实际的枚举值 所以,我想我可以有一个“基类”,我所有的枚举都可以从中扩展,而不必一直重复代码。因为枚举不能扩展类,所以我计划做的是,我可以通过接口来实现 我所知道的是: public interface IBaseEnum { String enumVal = null; public static <T extends Enum<T> &a

在我正在处理的一个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 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());
    }
}