Java 与仅使用字符串相比,在FSM中使用枚举是否有好处?

Java 与仅使用字符串相比,在FSM中使用枚举是否有好处?,java,enums,switch-statement,fsm,Java,Enums,Switch Statement,Fsm,我想创建一个有限状态机,我能找到的大多数示例代码都使用枚举,我只是想知道它是否比只使用字符串或int来存储状态有优势 使用枚举: 等级交通灯{ 枚举状态{ 红、黄、绿 }) 公共班机{ public static void main(final String[] args) throws InterruptedException { final TrafficLight a = new TrafficLight(); while (true) { a.itera

我想创建一个有限状态机,我能找到的大多数示例代码都使用枚举,我只是想知道它是否比只使用字符串或int来存储状态有优势

使用枚举:

等级交通灯{ 枚举状态{ 红、黄、绿 })

公共班机{

public static void main(final String[] args) throws InterruptedException {

    final TrafficLight a = new TrafficLight();
    while (true) {
        a.iterate();
    }
}
}

用绳子

公共交通灯{

String state = "GREEN";

public void iterate() throws InterruptedException {
    switch (state) {
        case "RED":
            System.out.println("RED");
            Thread.sleep(1000);
            state = "GREEN";
            break;

        case "GREEN":
            System.out.println("GREEN");
            Thread.sleep(1000);
            state = "YELLOW";
            break;

        case "YELLOW":
            System.out.println("YELLOW");
            Thread.sleep(1000);
            state = "RED";
            break;
    }
}
}

(两者使用相同的主方法)

它们对我来说似乎完全一样,我只是想知道是否有枚举更好的情况,或者字符串不起作用的情况


谢谢。

相对于
String
Enum
的主要优点是:这是更具体的类型,因为
Enum
指定了可能的值。
这使您的代码更加健壮,而且文档也更加完整。
对于FSM和更一般的有界值,这就是您要寻找的。
但对于可能的值是在运行时而不是在编译时定义的问题/域(从数据库或任何东西检索),
Enum
不是最佳候选

对您的案例感兴趣的枚举示例

使用Enum时,它将不会编译,因为
REDD
未在
状态中声明
Enum类:

case REDD:
    System.out.println("RED");
    Thread.sleep(1000);
    this.state = State.GREEN;
    break;
但使用字符串时,它将编译,只是无法按预期工作:

case "REDD":
    System.out.println("RED");
    Thread.sleep(1000);
    state = "GREEN";
    break;
枚举值是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();
}
现在,enum拥有足够的逻辑,使得不再需要
switch
语句:

public void iterate() throws InterruptedException {
    System.out.println(state);
    Thread.sleep(1000);         
    state = state.next();
}
public void iterate() throws InterruptedException {
    System.out.println(state);
    Thread.sleep(1000);         
    state = state.next();
}