2013-11-10 5 views
12

У меня есть ENUM в JAVA, я хотел бы сериализовать, так что, когда я вызываю его из любого места в коде, я получаю строчное представление имени.Печать Java ENUM в нижнем регистре по умолчанию, сохраняя константы перечисления в верхнем регистре

Допустим, у меня есть следующее перечисление:

public enum Status { 
    DRAFT, PENDING, COMPLETE; 
} 
println ("Status=" + Status.DRAFT); 

я хотел бы получить следующее:

Status=draft 

[Примечание]: Я хочу использовать константы перечислений в верхнем регистре, и при запросе значения получают представление в нижнем регистре.

+0

Это будет не сериализуйте Enum в нижний регистр. Это напечатает свое имя в нижнем регистре. – Pshemo

+0

Просто вопрос о недоразумении перевода, английский не мой родной язык, извините. – spacebiker

+0

OK, проблем нет. Я тоже в середине изучения английского языка :) – Pshemo

ответ

29

Я сам отвечаю на этот вопрос, так как нашел решение интересным и не нашел ответа на сайте. На всякий случай кто-то ищет способ решить эту проблему.

Раствор прост, просто переопределить метод ToString Enum так:

public enum Status { 
    DRAFT, PENDING, COMPLETE; 

    @Override 
    public String toString() { 
     return name().toLowerCase(); 
    } 
} 
println ("Status=" + Status.DRAFT); 

Это будет выводить имя в нижнем регистре.

+6

Это не очень хорошее решение (несмотря на upvotes), потому что теперь 'toString()' и 'name()' больше не возвращают одно и то же значение. Правда, он не говорит нигде, что они должны, но это их поведение по умолчанию, которое они делают. Кроме того, переопределяя 'toString()', вы только поймаете использование кода, например, в вашем примере - это своего рода неявный контракт. Это не чистый дизайн. Поскольку вы не можете переопределить 'name()', я бы скорее предоставил новый метод, например 'lowerCaseName()'. –

+3

Это абсолютно чистый способ сделать это, иначе toString не будет преодолимым, он работает так, как ожидалось для меня. Я не хочу использовать новый метод lowerCase, как в коде, я хочу получить строчное значение напрямую. Просто вопрос от разработчика. – spacebiker

+2

toString является надёжным для всех объектов, что не делает его использование подходящим. Я должен согласиться с Марселем, и на самом деле, поскольку вам кажется, что вы хотите прочитать читаемый ярлык из перечисления, вы должны просто ввести метод getLabel(). Тогда у вас есть хорошо определенный метод с четко определенным возвращаемым значением. toString() не является ни одной из этих вещей и используется только таким образом в нескольких крайне ограниченных случаях, когда значение объекта имеет стандартный формат defacto, такой как Integer, Boolean и String. Помимо этих незначительных случаев, вы никогда не должны полагаться на вывод toString(). – Robin

5

Если вы хотите использовать нижний регистр, вы можете просто использовать нижний регистр или смешанный футляр или что-то еще более разумное для вас.

public enum Status { 
    draft, pending, complete; 
} 

println ("Status=" + Status.draft); 

печатает

Status=draft 
+0

Привет, Питер, спасибо за ваш ответ, но посмотрите на мой ниже, я решил его, переопределив функцию Enum.toString. Ваш ответ не решает мой вопрос, так как я хотел бы использовать константное перечисление в верхнем регистре, но при запросе реального значения получаю строчное представление. – spacebiker

+1

ИМХО либо в верхнем регистре, либо в нижнем регистре является более читаемым и имеет смысл вставлять ваш вывод или код. Он отвечает на вопрос, потому что вы не сказали, что вам нужно иметь свои константы в верхнем регистре. –

+1

Вы правы, я не указал, что мне нужны константы в верхнем регистре, я думал, что это очевидно. Я редактировал вопрос. Спасибо – spacebiker

7

Другим решением может быть:

public enum Status { 
    DRAFT, PENDING, COMPLETE; 

    public String nameLowerCase(){ 
     return name().toLowerCase(); 
    } 
} 
-1

Вы можете использовать следующий класс Enum который содержит конструктор с именем и порядковым номером для каждой константы перечислимого. Вы можете назначить значения, необходимые для константы перечисления.

public enum Status { 

DRAFT(0,"draft"), PENDING(1,"pending"), COMPLETE(2,"complete"); 

private int key; 
private String value; 

Status(int key, String value){ 
    this.key = key; 
    this.value = value; 
} 

public int getKey() { 
    return key; 
} 

public void setKey(int key) { 
    this.key = key; 
} 

public String getValue() { 
    return value; 
} 

public void setValue(String value) { 
    this.value = value; 
} 

@Override 
public String toString(){ 
    return this.value; 
} 

} 

Поскольку мы переопределить метод toString, значение которого находится в нижнем регистре возвращается.

Использование

System.out.print("Status = "+Status.DRAFT); 

напечатает,

Status = draft 

и

System.out.print("Status = "+Status.DRAFT.name()); 

напечатает

Status = DRAFT 
+0

Нет необходимости хранить 'значение' как отдельную строку, так как вы можете просто вызвать' name(). ToLowerCase() '. – aarbor

Смежные вопросы