[英]Java enum overriding toString()
我之前从未真正使用Java枚举类来获取常量值,我过去通常使用“公共最终”方法。 我现在开始使用枚举,并且我重写了toString()方法以返回与枚举名称不同的值。
我有一些JPA代码,我在其中创建一个带有命名参数的TypedQuery,其中一个是枚举值的String表示。 如果我只使用Status.ACTIVE设置参数,我会得到正确的“A”值,但会抛出异常,因为它的类型实际上是Status而不是String。 它只有在我显式调用toString()方法时才有效。 我认为简单地重写toString()方法会导致返回一个String类型,无论类类型是什么。
这是枚举:
public enum Status {
ACTIVE ("A"),
PENDING ("P"),
FINISHED ("F");
private final String value;
Status(String value) {
this.value = value;
}
public String toString() {
return value;
}
};
这是TypedQuery:
TypedQuery<MechanicTimeEvent> query = entityManager().createQuery("SELECT o FROM MechanicTimeEvent o WHERE o.id.mechanicNumber = :mechanicNumber AND o.id.status = :status", MechanicTimeEvent.class);
query.setParameter("mechanicNumber", mechanicNumber);
query.setParameter("status", Status.ACTIVE.toString());
public enum Status {
ACTIVE,
PENDING,
FINISHED;
@Override
public String toString() {
String name = "";
switch (ordinal()) {
case 0:
name = "A";
break;
case 1:
name = "P";
break;
case 2:
name = "F";
break;
default:
name = "";
break;
}
return name;
}
};
如果我正确理解你的问题,你应该以其他方式进行枚举映射。 以这种方式,状态被存储为状态,JPA将基于其名称A,P,F来处理枚举。
public enum Status {
A("ACTIVE"),
P("PENDING"),
F("FINISHED");
通过这种方式,您可以在不调用toString()方法的情况下传递Status到JPA。 将自动调用ENUM上的.name()方法以获取持久性的状态代码。
MechanicTimeEvent bean的字段status
是枚举类型吗? 如果没有,我建议将其更改为枚举类型Status
。
您可以使用@Enumerated(EnumType.STRING)
对其进行注释
此外,我建议删除枚举的值部分,只使用如下名称:
public enum Status {
ACTIVE,
PENDING,
FINISHED;
}
这个或者您只需为该值实现一个getter:
public String getValue()
你在你的代码中调用它:
query.setParameter("status", Status.ACTIVE.getValue());
toString
只是Object中的一个普通方法,由PrintStream.println(记住System.out.println)等一些方法显式调用,或者在使用+运算符连接时考虑。 并非每种方法都需要实现此行为。
我建议你使用更具描述性的方法名称,如getValue
,并显式调用它而不是覆盖toString
java.lang.Enum said clearly:
/**
* Returns the name of this enum constant, exactly as declared in its
* enum declaration.
*
* <b>Most programmers should use the {@link #toString} method in
* preference to this one, as the toString method may return
* a more user-friendly name.</b> This method is designed primarily for
* use in specialized situations where correctness depends on getting the
* exact name, which will not vary from release to release.
*
* @return the name of this enum constant
*/
public final String name()
就像阁楼说的那样,你可以用“名字”的方法来获得这个名字。 你也可以使用toString()方法。
当然它只是这个枚举常量的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.