Каков наилучший способ, чтобы enum
тип представлял набор строк?
Я попробовал это:
enum Strings{
STRING_ONE("ONE"), STRING_TWO("TWO")
}
Как я могу их потом использовать как Strings
?
Я не знаю, что вы хотите сделать, но именно так я и перевел ваш пример кода ....
package test;
/**
* @author The Elite Gentleman
*
*/
public enum Strings {
STRING_ONE("ONE"),
STRING_TWO("TWO")
;
private final String text;
/**
* @param text
*/
Strings(final String text) {
this.text = text;
}
/* (non-Javadoc)
* @see java.lang.Enum#toString()
*/
@Override
public String toString() {
return text;
}
}
Кроме того, вы можете создать метод получения для text
.
Теперь вы можете сделать Strings.STRING_ONE.toString();
private String text
должно быть окончательным.final
было бы лучше.new
как конструкторprivate
. По сути, создание объекта запрещено иfinal
не является действительно необходимым в этом случае.setText(String)
в перечисление, и это может раскрыть адский :)final
вид ваших намерений, что это константа с поддержкой компилятора. Если бы вы использовалиString
константы, вы бы не объявили этоpublic static String
, верно?Пользовательские строковые значения для Enum
от http://javahowto.blogspot.com/2006/10/custom-string-values-for-enum.html
Строковым значением по умолчанию для перечисления java является его номинальное значение или имя элемента. Однако вы можете настроить строковое значение, переопределив метод toString (). Например,
Выполнение следующего тестового кода даст это:
источник
bin
каталоге: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class, который будет очень быстро складываться . Лучше всего сделать это как ожидаемый ответ, передав значения в конструктор enum. Я на самом деле не согласен с переопределениемtoString()
; Я считаю, что лучше использовать явный метод получения, такой какgetKey()
переопределениеtoString()
может быть неожиданным для другого пользователя enum.Используйте его
name()
метод:доходность
ONE
.источник
Strings.STRING_ONE.name()
выдает "STRING_ONE", а не "ONE". Это просто не хороший ответ. У вас не может быть строки, которая не была бы действительным идентификатором Java и т. Д.name()
может зависеть от программы обфускатора. Я столкнулся с подобной проблемой некоторое время назад. Например, с Proguard вам нужно обойти это. См. Перечисление Классов ПеречисленияЛибо задайте имя enum, совпадающее с желаемой строкой, либо, в более общем случае, вы можете связать произвольные атрибуты со значениями enum:
Важно иметь константы вверху и методы / атрибуты внизу.
источник
В зависимости от того, что вы подразумеваете под «использовать их как строки», вы можете не использовать здесь enum. В большинстве случаев решение, предлагаемое The Elite Gentleman, позволит вам использовать их через их методы toString, например, в
System.out.println(STRING_ONE)
илиString s = "Hello "+STRING_TWO
, но когда вам действительно нужны строки (напримерSTRING_ONE.toLowerCase()
), вы можете предпочесть определить их как константы:источник
toLowerCase()
мое решение, они могут пойтиStrings.STRING_TWO.toString().toLowerCase()
.interface
вместоfinal
классаprivate
конструктор. Это обескураженная практика.Вы можете использовать это для строки Enum
И вызов из основного метода
источник
Если вы не хотите использовать конструкторы и хотите иметь специальное имя для метода, попробуйте это так:
Я подозреваю, что это самое быстрое решение. Нет необходимости использовать переменные final .
источник
Получить и установить со значениями по умолчанию.
источник