【发布时间】:2016-08-28 13:04:41
【问题描述】:
为什么下面的代码会抛出异常?
我需要持久化枚举值,我猜测在数据库中持久化枚举值的最佳做法是将它们存储为小写字符串文字,因此需要努力。
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 数据库映射器尝试从数据库中自动填充实体对象时,我可以将小写字符串文字(在数据库中)转换为其大写枚举常量。我将反驳以他们的名字本身(即大写)来持久化枚举。
【问题讨论】:
-
因为没有名为
"swipe_button"的Type实例。不过有一个叫SWIPE_BUTTON。 -
如果您不打算调用
getEnum,为什么还要定义它? -
应该是
Type.valueOf("SWIPE_BUTTON") -
另一个提示:类型对于枚举来说是一个非常糟糕的名字。一切都是类型。称它为“SelectionType”之类的。
-
"我猜是最佳实践" 为什么它们是大写还是小写很重要?