Использование значений Enum в качестве строковых литералов - PullRequest
347 голосов
/ 12 июля 2011

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

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

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

Ответы [ 18 ]

593 голосов
/ 12 июля 2011

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

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

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

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

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() { }
}

Вариант четыре: *Интерфейсы 1026 * имеют все поля public, static и final:

public interface Modes {

    String MODE_1 = "Fancy Mode 1";
    String MODE_2 = "Fancy Mode 2";
    String MODE_3 = "Fancy Mode 3";  
}
456 голосов
/ 12 июля 2011

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

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

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

Modes mode = Enum.valueOf(Modes.class, name);
73 голосов
/ 29 августа 2014

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

Пример:

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
}
29 голосов
/ 02 октября 2014

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

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

27 голосов
/ 12 июля 2011

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

20 голосов
/ 31 марта 2016
public enum Modes {
  MODE1("Mode1"),
  MODE2("Mode2"),
  MODE3("Mode3");

 private String value;
 public String getValue() {
    return value;
   }
 private Modes(String value) {
  this.value = value;
 } 
}

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

Modes.MODE1.getvalue();

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

6 голосов
/ 12 июля 2011

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

Mode mode =
System.out.println("The mode is "+mode);
6 голосов
/ 12 июля 2011

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

Mode.mode1.name();

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

public enum Modes {
    mode1 ("Mode1"),
    mode2 ("Mode2"),
    mode3 ("Mode3");

    private String name;       

    private Modes(String s) {
        name = s;
    }
}
5 голосов
/ 28 декабря 2016

Для моих перечислений мне не очень нравится думать, что им присваивается по 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;
    }
}
5 голосов
/ 04 июня 2015

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

""+ Modes.mode1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...