gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:43:06 25 4
gpt4 key购买 nike

在我正在处理的 Java 应用程序中,我有许多枚举,最终有一个静态的 fromString它们中用于将字符串转换为其实际枚举值的方法。

所以,我认为我可以有一个“基”类,我的所有枚举都可以从该类扩展,而不必一直重复该代码。由于枚举不能扩展类,我计划做的是我可以通过接口(interface)来做到这一点。

我所拥有的是以下内容:

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;
}
}

然后,为了继承该静态方法,我将实现 IBaseEnum在我的实际枚举中:
public enum Colour implements IBaseEnum {
Red("red");
//...
}

但是,我遇到了 IBaseEnum 中的类型的问题。 .行 T.values()由于泛型类型 T 出现错误不能引用回枚举本身,因此它提示方法 values()没有找到。

这是继承枚举功能的正确方法吗?否则,我如何继承枚举中的方法,这样我就不必在每个枚举中复制/粘贴和重复相同的一组方法?

最佳答案

您的代码无法运行的原因有几个,我应该提到:

  • String enumVal = null; : IBaseEnum作为一个接口(interface),numVal获取隐式 public , static , 和 final修饰符。但是,您打算 enumVal成为实例属性。
  • T.values() : 当然这不会编译。但即使它可以(或者你有类实例),你仍然无法使这个动态化。静态方法是在编译时选择的。使其动态工作的唯一方法(我知道)是使用反射,当然传入枚举的类对象。

  • 因为你希望能够调用 Color.fromString(...) ,您别无选择,只能在每个枚举类中将其声明为静态方法。话虽如此,我认为您可以从逻辑中重用最多的是查找代码(同样,除非您使用反射)。

    要重用查找逻辑,您可以更改 IBaseEnum 的合约让它声明一个返回 enumVal 的方法值(value)。除此之外, 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;
    }
    }

    这将导致一个枚举类,如下所示:
    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());
    }
    }

    记住:如果 enumVal()旨在仅返回枚举文字,然后您可以通过使用 valueOf 来摆脱所有这些复杂性方法在所有枚举中都可用。仅当您的值的比较需要自定义逻辑时才执行此操作。

    关于java - 如何继承功能以减少枚举中的重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59436184/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com