更改枚举值

时间:2016-08-28 13:04:41

标签: java enums

为什么以下代码会抛出异常?

我需要保持枚举值,我猜测在数据库中保存枚举值的最佳做法是将它们存储为小写字符串文字,从而将这些工作存储起来。

public enum Type {

SWIPE_BUTTON("swipe_button"), DROP_DOWN("drop_down"), RADIO_BUTTON("radio_button"), CHECK_BOX("check_box");

private final String label;

private Type (String label) {
    this.label = label;
}

public String getValue() {
    return label;
}

@Override
public String toString() {
    return getValue();
}

public static Type getEnum (String value) {

    for (Type type : values())
        if (type.getValue().equals(value)) return type;

    throw new IllegalArgumentException("invalid value for type");
}

public static void main (String[] args) {

    System.out.println(Type.valueOf("swipe_button"));
}
}

我发现了这种方法here

更新

看起来我基本上试图覆盖valueOf方法,答案是不可能这样做。我试图覆盖此方法,以便当我的JPA数据库映射器尝试从数据库自动填充实体对象时,我可以将较低的字符串文字(在数据库中)转换为它们的大写枚举常量。我将反驳用自己的名字(即大写)来坚持枚举。

3 个答案:

答案 0 :(得分:2)

我需要保持枚举值,我猜是

不需要复杂的方法......

代替做

之类的事情
public enum Type {

SWIPE_BUTTON, DROP_DOWN, RADIO_BUTTON, CHECK_BOX;
}

并获取枚举器中常量的名称(这就是你最后需要的......)

保存 Type.name()而不是......

答案 1 :(得分:1)

Enum.valueOf使用名称,它不适用于您指定的字符串,因此您应该使用Type.valueOf("SWIPE_BUTTON"),因为名称是大写的。

可能你的意思是Type.getEnum("swipe_button")

答案 2 :(得分:1)

当你迭代可能的枚举常量时,比如

for (Type t : values() ) {
  System.out.println("t name:" + t. name());

你会发现枚举是建立在他们的名字上的。

请记住:从字符串构建枚举必须适用于所有种类的枚举。因此整个机制基于每个枚举常量的固定属性 - 这就是......好吧,它的名字。

因此:如果你想使用那个神奇的“valueOf()”方法;那么你必须遵循这个方法及其背后的魔法实际使用的规则。