【问题标题】:When class is detected as it extends Enum, how to call its valueOf() method?当检测到类扩展 Enum 时,如何调用其 valueOf() 方法?
【发布时间】:2016-05-01 13:56:45
【问题描述】:

我在Java 中有一个Enum

public enum TypeOfUser {
    EMPLOYEE("EMPLOYEE"),
    EMPLOYER("EMPLOYER");

    private final String type;
    TypeOfUser(final String type) {
        this.type = type;
    }

    public String getType() {
        return type;
    }
}

我在Hibernate 映射中使用它,所以如果我想添加过滤,我使用Criteria 接口。我基于Map 构建标准,此时我检测它是否继承自Enum(因为每个Enum 都隐式继承自Java Enum 类)并调用valueOf()TypeOfUser 方法:

Class fieldClass = element.getValue().getValue();
if (Enum.class.isAssignableFrom(fieldClass)) {
     criteria.add(
         Restrictions.eq(element.getKey(), 
         TypeOfUser.valueOf(element.getValue().getKey()))
      );
}

但它之所以有效,只是因为我的项目中只有一个 Enum,而且将来还会有更多,比如 Months 左右。有没有办法,当类被检测为Enum 时,转换它然后调用它的valueOf() 方法?比如:

Class fieldClass = element.getValue().getValue();
if (Enum.class.isAssignableFrom(fieldClass)) {
     criteria.add(
         Restrictions.eq(element.getKey(),
         ((Enum.class)fieldClass).valueOf(element.getValue().getKey()))
      );
 }

我想这样做是为了避免if-elseswitch 指令,例如:

if (fieldClass.equals(TypeOfUser.class)) {
    value = TypeOfUser.valueOf(key);
}
else if (fieldClass.equals(Months.class)) {
    value = Months.valueOf(key);
}

因为当项目中存在许多Enums 时,它们可能很难维护。 Java 有机会吗?提前感谢您的帮助。

【问题讨论】:

  • 您到底想达到什么目的?为什么所有这些反射代码?
  • @JBNizet 因为我想编写QueryRestriction 类,我可以在其中放置分页、过滤、排序等,然后调用像build() 这样的方法,它会返回一个标准。我认为它应该尽可能通用,因为它应该更适合LongStringEnum 等的字段,甚至是真正的类,例如具有PlaceMeeting。也许我错了:) 但我认为它需要通用代码。附言Enum.valueOf(fieldClass, key) 正在做这项工作。

标签: java hibernate class enums hibernate-criteria


【解决方案1】:

您正在寻找Enum.valueOf

Class<E> enumClass = ...
String name = ...
E e = Enum.valueOf(enumClass, name);

【讨论】:

    【解决方案2】:

    Enum.valueOf(fieldClass, key) 在我看来应该可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      相关资源
      最近更新 更多