Реализация toString на Java перечислениях

Кажется, на Java возможно написать что-то вроде этого:

 private enum TrafficLight {
  RED,
  GREEN;

  public String toString() {
   return //what should I return here if I want to return
                               //"abc" when red and "def" when green?
  }
 }

Теперь я хотел бы знать, возможно ли возвратить метод toString "abc", когда значение перечисления будет красным, а "def" - ​​зеленым. Кроме того, возможно ли сделать это на С#, где вы можете это сделать:

 private enum TrafficLight {
  RED = 0,
  GREEN = 15
  ...
 }

Я пробовал это, но это, но я получаю с ним ошибки компилятора.

Спасибо

Ответ 1

Ans 1:

enum TrafficLight {
  RED,
  GREEN;

  @Override
  public String toString() {
    switch(this) {
      case RED: return "abc";
      case GREEN: return "def";
      default: throw new IllegalArgumentException();
    }
  }
}

Ans 2:

enum TrafficLight {
  RED(0),
  GREEN(15);

  int value;
  TrafficLight(int value) { this.value = value; }
}

Ответ 2

Вы можете сделать это следующим образом:

private enum TrafficLight {
   // using the constructor defined below
   RED("abc"),
   GREEN("def");

   // Member to hold the name
   private String string;

   // constructor to set the string
   TrafficLight(String name){string = name;}

   // the toString just returns the given name
   @Override
   public String toString() {
       return string;
   }
}

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

An enum в Java - это в основном class, у которого есть определенное количество экземпляров.

Ответ 3

Также, если вам нужно получить строковое значение нижнего регистра перечисления ( "красный", "зеленый" ), вы можете сделать это следующим образом:

private enum TrafficLight {
  RED,
  GREEN;

  @Override
  public String toString() {
   return super.toString().toLowerCase();
  }
}