java-在FSM中使用枚举比仅使用字符串有好处吗?
作者:互联网
我想创建一个有限状态机,我可以找到的大多数示例代码都使用了枚举,而我只是想知道它是否比仅使用字符串或整数存储状态更具优势.
使用枚举:
class TrafficLight {
枚举状态{
红,黄,绿
};
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 static void main(final String[] args) throws InterruptedException {
final TrafficLight a = new TrafficLight();
while (true) {
a.iterate();
}
}
}
带弦
公共类TrafficLight {
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;
}
}
}
(两者使用相同的主要方法)
它们对我来说似乎完全一样,我只是想知道是否在某些情况下枚举更好,或者字符串不起作用.
谢谢.
解决方法:
Enum优于String的主要优点:由于Enum指定了可能的值,因此更具体地键入了此类型.
这使您的代码既更健壮,又有更好的文档记录.
对于FSM和更一般的有界值,这就是您要寻找的.
但是对于在运行时而不是在编译时(从数据库或其他任何东西中)定义可能值的问题/领域,Enum并不是最佳选择.
案例中的Enum利息示例
使用Enum时,它将不会编译,因为State枚举类中未声明REDD:
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();
}
标签:enums,switch-statement,fsm,java 来源: https://codeday.me/bug/20191024/1923369.html