Відповіді:
Я не знаю, що ви хочете зробити, але саме так я переклав ваш приклад код ....
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;
}
}
Крім того, ви можете створити метод getter для 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 enum є його номінал або ім'я елемента. Однак ви можете налаштувати значення рядка, замінивши метод 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()
; Я вважаю, що краще використовувати явний getter, наприклад, 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.
}
Важливо мати константи вгорі, а методи / атрибути - внизу.
Залежно від того, що ви маєте на увазі під «використовувати їх як рядки», ви, можливо, не захочете використовувати тут перерахунок. У більшості випадків, рішення , запропоноване The Elite Gentleman дозволить використовувати їх через ToString-методи, наприклад , в System.out.println(STRING_ONE)
або String s = "Hello "+STRING_TWO
, але якщо вам дійсно потрібно Strings (наприклад 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();
}
Я підозрюю, що це найшвидше рішення. Немає необхідності використовувати змінні остаточні .
private String text
повинна бути остаточною.