Java枚举重写toString()

时间:2011-10-13 17:55:45

标签: java jpa enums 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());

6 个答案:

答案 0 :(得分:5)

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;
    }
};

答案 1 :(得分:3)

如果我理解你的问题,你应该以其他方式进行枚举映射。通过这种方式,状态存储为状态,JPA将根据其名称A,P,F处理枚举。

public enum Status {
    A("ACTIVE"),
    P("PENDING"),
    F("FINISHED");

通过这种方式,您可以在不调用toString()方法的情况下传递Status到JPA。将自动调用ENUM上的.name()方法以获取持久性的状态代码。

答案 2 :(得分:3)

MechanicTimeEvent bean的字段status是枚举类型吗? 如果没有,我建议将其更改为枚举类型Status

您可以使用@Enumerated(EnumType.STRING)

对其进行注释

此外,我建议删除枚举的值部分 只需使用如下名称:

public enum Status {
   ACTIVE,
   PENDING,
   FINISHED;
}

答案 3 :(得分:0)

这个或者您只是为值实现一个getter:

public String getValue()

你在代码中调用它:

query.setParameter("status", Status.ACTIVE.getValue());

答案 4 :(得分:0)

toString只是Object中的一个普通方法,由PrintStream.println(记住System.out.println)等一些方法显式调用,或者在使用+运算符连接时考虑。并非每种方法都需要实现此行为。

我建议您使用更具描述性的方法名称,例如getValue并明确调用它而不是覆盖toString

答案 5 :(得分:-1)

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()方法。

当然它只是这个枚举常量的名称。