【发布时间】: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-else 或switch 指令,例如:
if (fieldClass.equals(TypeOfUser.class)) {
value = TypeOfUser.valueOf(key);
}
else if (fieldClass.equals(Months.class)) {
value = Months.valueOf(key);
}
因为当项目中存在许多Enums 时,它们可能很难维护。 Java 有机会吗?提前感谢您的帮助。
【问题讨论】:
-
您到底想达到什么目的?为什么所有这些反射代码?
-
@JBNizet 因为我想编写
QueryRestriction类,我可以在其中放置分页、过滤、排序等,然后调用像build()这样的方法,它会返回一个标准。我认为它应该尽可能通用,因为它应该更适合Long、String、Enum等的字段,甚至是真正的类,例如具有Place的Meeting。也许我错了:) 但我认为它需要通用代码。附言Enum.valueOf(fieldClass, key)正在做这项工作。
标签: java hibernate class enums hibernate-criteria