Java枚举重写toString()

Pat*_*ard 5 java enums jpa 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

这是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());
Run Code Online (Sandbox Code Playgroud)

小智 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;
    }
};
Run Code Online (Sandbox Code Playgroud)

  • 这个toString()实现需要太多维护,特别是如果将来会添加枚举名称.最好在instanciation上分配一个字符串值,然后返回它. (6认同)

lau*_*wie 3

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

你可以用它来注释它@Enumerated(EnumType.STRING)

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

public enum Status {
   ACTIVE,
   PENDING,
   FINISHED;
}
Run Code Online (Sandbox Code Playgroud)