Использование значений Enum как строковых литералов

Каков наилучший способ использовать значения, хранящиеся в Enum как строковые литералы? Например:

public enum Modes { some-really-long-string, mode1, mode2, mode3 } 

Затем я смог использовать Mode.mode1 чтобы вернуть его строковое представление как mode1 . Без необходимости вызывать Mode.mode1.toString() .

Вы не можете. Я думаю, у вас здесь есть четыре варианта. Все четыре предлагают решение, но с немного другим подходом …

Вариант один: используйте встроенное name() для enums. Это отлично, если вам не нужен какой-либо специальный формат именования.

  String name = Modes.mode1.name(); // Returns the name of this enum constant, exactly as declared in its enum declaration. 

Вариант второй: добавьте переопределяющие свойства к вашим enumsм, если вы хотите большего контроля

 public enum Modes { mode1 ("Fancy Mode 1"), mode2 ("Fancy Mode 2"), mode3 ("Fancy Mode 3"); private final String name; private Modes(String s) { name = s; } public boolean equalsName(String otherName) { // (otherName == null) check is not needed because name.equals(null) returns false return name.equals(otherName); } public String toString() { return this.name; } } 

Вариант третий: используйте статические финалы вместо перечислений:

 public final class Modes { public static final String MODE_1 = "Fancy Mode 1"; public static final String MODE_2 = "Fancy Mode 2"; public static final String MODE_3 = "Fancy Mode 3"; private Modes() { } } 

Вариант 4. Интерфейсы имеют все полевые публичные, статические и конечные:

 public interface Modes { String MODE_1 = "Fancy Mode 1"; String MODE_2 = "Fancy Mode 2"; String MODE_3 = "Fancy Mode 3"; } 

Каждое перечисление имеет как имя (), так и метод valueOf (String). Первый возвращает имя строки enums, а последнее дает значение enums, чье имя является строкой. Это похоже на то, что вы ищете?

 String name = Modes.mode1.name(); Modes mode = Modes.valueOf(name); 

Существует также статическое значение Of (class, строка) для Enum, поэтому вы также можете использовать

 Modes mode = Enum.valueOf(Modes.class, name); 

Вы можете переопределить метод toString() для каждого значения enums.

Пример:

 public enum Country { DE { @Override public String toString() { return "Germany"; } }, IT { @Override public String toString() { return "Italy"; } }, US { @Override public String toString() { return "United States"; } } } 

Применение:

 public static void main(String[] args) { System.out.println(Country.DE); // Germany System.out.println(Country.IT); // Italy System.out.println(Country.US); // United States } 

mode1.name() или String.valueOf(mode1) . Боюсь, это не лучше.

Как упоминает Бенни Неугебауэр, вы можете перезаписать toString (). Однако вместо перезаписывания toString для каждого поля enums мне больше нравится что-то вроде этого:

 public enum Country{ SPAIN("España"), ITALY("Italia"), PORTUGAL("Portugal"); private String value; Country(final String value) { this.value = value; } public String getValue() { return value; } @Override public String toString() { return this.getValue(); } } 

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

 public enum Modes { MODE1("Mode1"), MODE2("Mode2"), MODE3("Mode3"); private String value; public String getValue() { return value; } private Modes(String value) { this.value = value; } } 

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

 Modes.MODE1.getvalue(); 

Это вернет «Mode1» в виде строки.

Вы можете использовать Mode.mode1.name() однако вам часто не нужно это делать.

 Mode mode = System.out.println("The mode is "+mode); 

Насколько я знаю, единственным способом получить имя будет

 Mode.mode1.name(); 

Однако, если вам это действительно нужно, вы можете сделать следующее:

 public enum Modes { mode1 ("Mode1"), mode2 ("Mode2"), mode3 ("Mode3"); private String name; private Modes(String s) { name = s; } } 

Вы можете просто использовать:

 ""+ Modes.mode1 

Enum – это всего лишь небольшой class. Enums могут хранить дополнительные поля, внедрять методы и т. Д. Например

 public enum Modes { mode1('a'), mode2('b'), mode3('c'), ; char c; private Modes(char c) { this.c = c; } public char character() { return c; } } 

Теперь вы можете сказать:

System.out.println(Modes.mode1.character())

и см. вывод: a

 package com.common.test; public enum Days { monday(1,"Monday"),tuesday(2,"Tuesday"),wednesday(3,"Wednesday"), thrusday(4,"Thrusday"),friday(5,"Friday"),saturday(6,"Saturday"),sunday(7,"Sunday"); private int id; private String desc; Days(int id,String desc){ this.id=id; this.desc=desc; } public static String getDay(int id){ for (Days day : Days.values()) { if (day.getId() == id) { return day.getDesc(); } } return null; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } }; 

Для моих перечислений мне не очень нравится думать, что они выделяются по 1 строке. Вот как я реализую метод toString () для перечислений.

 enum Animal { DOG, CAT, BIRD; public String toString(){ switch (this) { case DOG: return "Dog"; case CAT: return "Cat"; case BIRD: return "Bird"; } return null; } } 

Этот метод должен работать с любым enum :

 public enum MyEnum { VALUE1, VALUE2, VALUE3; public int getValue() { return this.ordinal(); } public static DataType forValue(int value) { return values()[value]; } public String toString() { return forValue(getValue()).name(); } } 

мое решение для вашей проблемы!

 import java.util.HashMap; import java.util.Map; public enum MapEnumSample { Mustang("One of the fastest cars in the world!"), Mercedes("One of the most beautiful cars in the world!"), Ferrari("Ferrari or Mercedes, which one is the best?"); private final String description; private static Map enumMap; private MapEnumSample(String description) { this.description = description; } public String getEnumValue() { return description; } public static String getEnumKey(String name) { if (enumMap == null) { initializeMap(); } return enumMap.get(name); } private static Map initializeMap() { enumMap = new HashMap(); for (MapEnumSample access : MapEnumSample.values()) { enumMap.put(access.getEnumValue(), access.toString()); } return enumMap; } public static void main(String[] args) { // getting value from Description System.out.println(MapEnumSample.getEnumKey("One of the fastest cars in the world!")); // getting value from Constant System.out.println(MapEnumSample.Mustang.getEnumValue()); System.out.println(MapEnumSample.getEnumKey("One of the most beautiful cars in the world!")); System.out.println(MapEnumSample.Mercedes.getEnumValue()); // doesnt exist in Enum System.out.println("Mustang or Mercedes, which one is the best?"); System.out.println(MapEnumSample.getEnumKey("Mustang or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that " + MapEnumSample.getEnumKey("Ferrari or Mustang, which one is the best?") + " is the best!."); // exists in Enum System.out.println("Ferrari or Mercedes, wich one is the best?"); System.out.println(MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") == null ? "I don't know!" : "I believe that " + MapEnumSample.getEnumKey("Ferrari or Mercedes, which one is the best?") + " is the best!"); } } 

после многих попыток я пришел с этим решением

 public static enum Operation { Addition, Subtraction, Multiplication, Division,; public String getUserFriendlyString() { if (this==Addition) { return " + "; } else if (this==Subtraction) { return " - "; } else if (this==Multiplication) { return " * "; } else if (this==Division) { return " / "; } return "undefined"; } } 
 Modes.MODE1.toString(); 

Это простой способ без создания интерфейсов, classов или геттеров

 public enum Environment { PROD("https://prod.domain.com:1088/"), SIT("https://sit.domain.com:2019/"), CIT("https://cit.domain.com:8080/"), DEV("https://dev.domain.com:21323/"); private String url; Environment(String envUrl) { this.url = envUrl; } public String getUrl() { return url; } } String prodUrl = Environment.PROD.getUrl(); 

Он напечатает:

 https://prod.domain.com:1088/ 

Эта конструкция для константных строковых констант работает в большинстве случаев.

  • Как разбирать строку в nullable int
  • Java Замена нескольких разных подстрок в строке сразу (или наиболее эффективным способом)
  • C - зачем нужен strcpy ()
  • Разделить строку на подстроки равной длины в Java
  • Почему String.chars () stream ints в Java 8?
  • Получение ошибки «команда не найдена» при сравнении двух строк в Bash
  • Как указать длинный текст в меньший фиксированный столбец с CSS?
  • Как преобразовать строку в верхний или нижний регистр с помощью XSLT?
  • Могу ли я избежать двойной кавычки в стенографическом литерале?
  • Как преобразовать / разобрать из String в char в java?
  • Разница между строковым объектом и строковым литералом
  • Давайте будем гением компьютера.