【问题标题】:Changing enum values更改枚举值
【发布时间】: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”之类的。
  • "我猜是最佳实践" 为什么它们是大写还是小写很重要?

标签: java enums


【解决方案1】:

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

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

改为做类似的事情

public enum Type {

SWIPE_BUTTON, DROP_DOWN, RADIO_BUTTON, CHECK_BOX;
}

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

保存 Type.name() 代替...

【讨论】:

  • 在数据库中是小写还是大写?
  • 这将与枚举中定义的相同...名称是一个字符串,因此如果需要小写,您可以执行 Type.name().toLowerCase()
  • 另一个复杂性是我的客户以小写形式写入 DB,并且在获取时我试图使用 Spring 的 MongoDB 映射器自动填充实体对象,该映射器直接使用 Enum.valueOf
  • 然后从数据库中读取它时使用 Enum.valueOf(stringRestored.toUpperCase())
  • 映射器库在其代码中执行此操作。因此,我试图覆盖这个我认为不可能的方法。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多