【问题标题】:Convert a String to an Enum?将字符串转换为枚举?
【发布时间】:2009-11-30 09:18:20
【问题描述】:

您好,我无法概括我为特定枚举编写的函数:

public static enum InstrumentType {
    SPOT {
        public String toString() {
            return "MKP";
        }
    },
    VOLATILITY {
        public String toString() {
            return "VOL";
        }
    };

    public static InstrumentType parseXML(String value) {
        InstrumentType ret = InstrumentType.SPOT;

        for(InstrumentType instrumentType : values()) {
            if(instrumentType.toString().equalsIgnoreCase(value)) {
                ret = instrumentType;
                break;
            }
        }

        return ret;
    }
} 

我希望在函数中添加一个新参数来表示任何枚举。我知道我应该使用模板,但我不能在函数代码中使用函数“values()”。 基本上我想要的是一个 valueOf 函数,它使用我定义的 toString() 值。

提前致谢。

【问题讨论】:

  • 将枚举命名为 MKP 和 VOL 会不会更容易,这样您就可以免费解析字符串?
  • 我同意,但我也希望它选择一个默认值,并且我不希望 ENUM 的名称依赖于它打印的字符串。

标签: java enums


【解决方案1】:

尝试一种更简洁的方式来编写你的枚举:

public static enum InstrumentType {

    SPOT("MKP"),
    VOLATILITY("VOL");

    private final String name;

    InstrumentType(String name)
    {
        this.name = name;
    }

    public String toString()
    {
        return this.name;
    }

    public static InstrumentType getValue(String s)
    {
        for (InstrumentType t : InstrumentType.values())
        {
            if (t.toString().equals(s))
                return t;
        }
        return SOME_DEFAULT_VALUE;
    }
}

这也解决了你的 String -> Enum 的问题。仅使用三个字母的首字母缩写词作为枚举名称可能更简洁,但如果您需要根据其他参数做出 getValue() 决策,这是正确的方法。

【讨论】:

  • 这是覆盖 toString 方法的一种更简洁的方法,谢谢。
  • +1 我们天生对线性搜索很敏感,所以我们往往没有意识到在中小型枚举中它永远不会真正花费那么多。
  • 只是想提请注意(因为我一开始错过了)getValue 的命名与您免费获得的静态 valueOf 的名称不同。 valueOf 不能被覆盖。
  • FWLIW,我会使用一个与“toValue”稍有不同的名称——没有办法“关闭”toValue,而且很可能会在不注意的情况下使用错误的名称。即使只是“getValueOf”就足够了。
【解决方案2】:

我相信 Enums 可以实现接口,因此您可以使用 values() 方法定义一个,然后将其用作参数类型。

但正如评论者所说,如果您将枚举命名为 MKP、VOL 等可能会更容易

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2014-03-18
    • 2015-06-10
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2016-07-30
    • 2012-12-07
    相关资源
    最近更新 更多