Перечисление Java, переопределяющее toString () - PullRequest
5 голосов
/ 13 октября 2011

Я никогда прежде не использовал классы перечисления Java для постоянных значений, в прошлом я обычно использовал подход "public final". Сейчас я начал использовать enum и переопределяю метод toString (), чтобы он возвращал значение, отличное от имени enum.

У меня есть некоторый код JPA, в котором я создаю TypedQuery с именованными параметрами, одним из которых является строковое представление значения перечисления. Если я просто устанавливаю параметр с помощью 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 ]

5 голосов
/ 23 октября 2012
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;
    }
};
3 голосов
/ 13 октября 2011

Является ли поле status bean-компонента MechanicTimeEvent типом enum?Если нет, я бы предложил изменить его на тип перечисления Status.

. Вы можете аннотировать его с помощью @Enumerated(EnumType.STRING)

Более того, я бы предложил удалить часть значения из вашего перечисления ипросто используйте имена как:

public enum Status {
   ACTIVE,
   PENDING,
   FINISHED;
}
3 голосов
/ 13 октября 2011

Если я правильно понимаю ваш вопрос, вы должны сделать enum mapping наоборот.Таким образом, состояния сохраняются как состояние, и JPA будет обрабатывать перечисление на основе его имени A, P, F).

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

Таким образом, вы можете просто передать Status, не вызывая метод toString () дляJPA.Метод .name () в ENUM будет вызываться автоматически для получения кода состояния для сохранения.

0 голосов
/ 11 апреля 2012
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()

точно так же, как говорят в лофте, вы можете использовать метод "name", чтобы получить имя.также вы можете использовать метод toString ().

конечно, это просто имя этой константы перечисления.

0 голосов
/ 13 октября 2011

toString - это просто обычный метод в Object, который явно вызывается некоторыми методами, такими как PrintStream.println (вспомните System.out.println), или рассматривается при объединении с использованием оператора +.Не каждый метод должен реализовывать это поведение.

Я бы посоветовал вам использовать более описательное имя метода, например getValue, и вызывать его явно вместо переопределения toString

0 голосов
/ 13 октября 2011

Это или вы просто реализуете геттер для значения:

public String getValue()

И вы называете это в своем коде:

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