Ответы:
Я не знаю, что вы хотите сделать, но именно так я и перевел ваш пример кода ....
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();
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 (). Например,
public enum MyType {
ONE {
public String toString() {
return "this is one";
}
},
TWO {
public String toString() {
return "this is two";
}
}
}
Выполнение следующего тестового кода даст это:
public class EnumTest {
public static void main(String[] args) {
System.out.println(MyType.ONE);
System.out.println(MyType.TWO);
}
}
this is one
this is two
bin
каталоге: EnumTest $ MyType.class EnumTest $ MyType $ 1.class EnumTest $ MyType $ 2.class, который будет очень быстро складываться . Лучше всего сделать это как ожидаемый ответ, передав значения в конструктор enum. Я на самом деле не согласен с переопределением toString()
; Я считаю, что лучше использовать явный метод получения, такой как getKey()
переопределение toString()
может быть неожиданным для другого пользователя enum.
Используйте его name()
метод:
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(Strings.ONE.name());
}
}
enum Strings {
ONE, TWO, THREE
}
доходность ONE
.
Strings.STRING_ONE.name()
выдает "STRING_ONE", а не "ONE". Это просто не хороший ответ. У вас не может быть строки, которая не была бы действительным идентификатором Java и т. Д.
name()
может зависеть от программы обфускатора. Я столкнулся с подобной проблемой некоторое время назад. Например, с Proguard вам нужно обойти это. См. Перечисление Классов Перечисления
Либо задайте имя enum, совпадающее с желаемой строкой, либо, в более общем случае, вы можете связать произвольные атрибуты со значениями enum:
enum Strings {
STRING_ONE("ONE"), STRING_TWO("TWO");
private final String stringValue;
Strings(final String s) { stringValue = s; }
public String toString() { return stringValue; }
// further methods, attributes, etc.
}
Важно иметь константы вверху и методы / атрибуты внизу.
В зависимости от того, что вы подразумеваете под «использовать их как строки», вы можете не использовать здесь enum. В большинстве случаев решение, предлагаемое The Elite Gentleman, позволит вам использовать их через их методы toString, например, в System.out.println(STRING_ONE)
или String s = "Hello "+STRING_TWO
, но когда вам действительно нужны строки (например STRING_ONE.toLowerCase()
), вы можете предпочесть определить их как константы:
public interface Strings{
public static final String STRING_ONE = "ONE";
public static final String STRING_TWO = "TWO";
}
toLowerCase()
мое решение, они могут пойти Strings.STRING_TWO.toString().toLowerCase()
.
interface
вместо final
класса private
конструктор. Это обескураженная практика.
Вы можете использовать это для строки Enum
public enum EnumTest {
NAME_ONE("Name 1"),
NAME_TWO("Name 2");
private final String name;
/**
* @param name
*/
private EnumTest(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
И вызов из основного метода
public class Test {
public static void main (String args[]){
System.out.println(EnumTest.NAME_ONE.getName());
System.out.println(EnumTest.NAME_TWO.getName());
}
}
Если вы не хотите использовать конструкторы и хотите иметь специальное имя для метода, попробуйте это так:
public enum MyType {
ONE {
public String getDescription() {
return "this is one";
}
},
TWO {
public String getDescription() {
return "this is two";
}
};
public abstract String getDescription();
}
Я подозреваю, что это самое быстрое решение. Нет необходимости использовать переменные final .
private String text
должно быть окончательным.