gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:39 25 4
gpt4 key购买 nike

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

使用枚举:

类交通灯{ 枚举状态{ 红、黄、绿 };

State state = State.GREEN;

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

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

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

}

公共(public)课主要{

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

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

带字符串

公共(public)类交通灯{

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

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

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

谢谢。

最佳答案

Enum 相对于 String 的主要优势:这是更具体的类型,因为 Enum 指定了可能的值。
这使您的代码更健壮,文档也更好。
对于 FSM 和更一般的有界值,这就是您要找的东西。
但是对于可能的值是在运行时而不是编译时定义的问题/领域(从数据库或其他任何地方检索),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;

枚举值是枚举类的实例,具有自己的实例字段值,但也具有覆盖实例方法的能力

这是枚举在 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();
}

关于java - 与仅使用字符串相比,在 FSM 中使用枚举是否有好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54440408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com