Основное преимущество для Enum
над String
: более конкретно оно набрано, поскольку Enum
указывает возможные значения.
Это делает ваш код более надежным и лучше документированным.
Для FSM и болееобычно ограниченные значения, это то, что вы ищете.
Но для проблем / областей, где возможные значения определены во время выполнения, а не во время компиляции (извлечение из базы данных или что-то еще), Enum
не лучший кандидат.
Пример интереса Enum в вашем случае
При использовании Enum он не будет компилироваться, поскольку REDD
не объявлено в классе перечисления State
:
case REDD:
System.out.println("RED");
Thread.sleep(1000);
this.state = State.GREEN;
break;
Но с String он будет компилироваться и просто не будет работать должным образом:
case "REDD":
System.out.println("RED");
Thread.sleep(1000);
state = "GREEN";
break;
Перечисляемые значения являются экземплярами класса enum с собственными значениями для полей экземпляров, но также с переопределением способностей.например, методы
Это еще одно преимущество enum в FSM или любом домене, где перечисляемые значения связаны с конкретными свойствами / обработками и где в соответствии с перечисляемым значением значения полей или поведение метода могутотличаются.
Например, здесь мы указываем поведение для получения следующего перехода:
enum State {
YELLOW(){
@Override
public State next() {
return RED;
}
},
RED(){
@Override
public State next() {
return GREEN;
}
},
GREEN(){
@Override
public State next() {
return YELLOW;
}
};
public abstract State next();
}
Теперь перечисление содержит достаточно логики, чтобы оператор switch
больше не требовался:
public void iterate() throws InterruptedException {
System.out.println(state);
Thread.sleep(1000);
state = state.next();
}