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

269
37

Кажется, на 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
...
}

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


Спасибо

спросил(а) 2021-01-19T16:35:02+03:00 6 месяцев, 2 недели назад
1
Решение
371

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


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, у которого есть определенное количество экземпляров.

ответил(а) 2021-01-19T16:35:02+03:00 6 месяцев, 2 недели назад
322

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; }
}

ответил(а) 2021-01-19T16:35:02+03:00 6 месяцев, 2 недели назад
119

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


private enum TrafficLight {
RED,
GREEN;

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

ответил(а) 2021-01-19T16:35:02+03:00 6 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема