【问题标题】:How to convert string value into Enum in Java?如何在Java中将字符串值转换为枚举?
【发布时间】:2013-07-03 02:13:09
【问题描述】:

在我的 Java 程序中有 Enum 类,如..

public enum DemoType{
DAILY, WEEKLY, MONTHLY;
 }

在我的 jsp 中,我从用户那里获取值,比如选择框,这个 Jsp 被称为 DemoJspBean ..

<form:select path="repeatWeektype">
    <form:option value="DAILY" />
    <form:option value="WEEKLY" />
    <form:option value="MONTHLY" />
</form:select>

我的 HibernateVO 课程是 ..

public class DemoVO{
  @Column(name = "REPEAT_TYPE")
  @Enumerated(EnumType.STRING)
  private RepeatType repeatType;
}

现在我想使用 Hibernate Bean(setter 和 getter)将此值插入 DB

DemoVO demo = new DemoVO();
demo.setRepeatType(demoJspBean.getRepeatWeektype());

但显示错误..

那么如何将我的 String 值转换为枚举类类型呢?

【问题讨论】:

标签: java spring hibernate enums


【解决方案1】:

Enum 类上使用valueOf 方法。

DemoType demoType =   DemoType.valueOf("DAILY")

如果提供的字符串参数无效,它将抛出IllegalArgumentException。用你的例子

DemoType demoType =  DemoType.valueOf("HOURLY");

上面的行会抛出一个IllegalArgumentException,因为HOURLY 不是你的DemoType 的一部分

【讨论】:

  • 拜托..我想要更多的澄清。
  • 如果 UI 上的下拉列表是使用 Enum 填充的,那么这应该不是问题。但是,作为一种实践,需要在执行业务逻辑之前对从 UI 接收的数据添加验证。
【解决方案2】:

这可以帮助您了解enum 类型的工作原理。

说,这是我的enum 班级。

public enum GetDate {

SUNDAY("1"), MONDAY("2"), TUESDAY("3"), WEDNESDAY("4"), THURSDAY("5"), FRIDAY("6"), SATURDAY("7");
private String code;

private GetDate(String code) {
    this.code = code;
}

public String getCode() {
    return code;
}

public static GetDate getEnum(String code) {

    switch (code) {
        case "1":
            return SUNDAY;
        case "2":
            return MONDAY;
        case "3":
            return TUESDAY;
        case "4":
            return WEDNESDAY;
        case "5":
            return THURSDAY;
        case "6":
            return FRIDAY;
        case "7":
            return SATURDAY;
        default:
            return null;
     }
   }
 }

以下显示了我的enum 的工作原理

public class MyClass {
public static void main(String[] args) {
    System.out.println("Sunday enum value " + GetDate.SUNDAY);  // enum SUNDAY
    System.out.println("Name of the day assign to 1 " + GetDate.getEnum("1"));  // enum SUNDAY
    System.out.println("Sunday enum value " + GetDate.valueOf("SUNDAY").getCode()); // String code of SUNDAY
    System.out.println("Sunday enum value " + GetDate.valueOf("SUNDAY"));// enum Sunday
   }
}

【讨论】:

  • 它有效。但它的重量太重了。如果是这样,与普通类相比,我看不到枚举的好处。
【解决方案3】:

如果由于某种原因您使用了枚举中不存在的值(使用方法DemoType.valueOf(),您将获得java.lang.IllegalArgumentException。嘿!等等!,您可以迭代这些值:

public static void main(String[] args) {
    System.out.println(DemoType.convert("DAILY"));
    System.out.println(DemoType.convert("YEARLY"));
}

enum DemoType {
    DAILY, WEEKLY, MONTHLY;
    public static DemoType convert(String str) {
        for (DemoType demoType : DemoType.values()) {
            if (demoType.toString().equals(str)) {
                return demoType;
            }
        }
        return null;
    }
}

输出:

DAILY
null

【讨论】:

  • 返回 null 会在整个 API 中传播 null 检查,这很容易避免。而是向枚举添加一个 UNKNOWN 值,以在不匹配的情况下返回。
【解决方案4】:

使用 Spring 的 TypeConverterSupport,您可以像这样将字符串属性解析为枚举实例:

@Value("${enum.type}") 
MyEnum enum;

【讨论】:

    【解决方案5】:

    您可以通过传递字符串来使用DemoType.valueOf()方法,该方法会将其转换为字符串对应的DemoType枚举。确保字符串值与声明的枚举相同。例如

        DemoType dt = DemoType.valueOf("DAILY")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 2023-03-28
      • 2010-10-03
      相关资源
      最近更新 更多