Java 与仅使用字符串相比,在FSM中使用枚举是否有好处?
我想创建一个有限状态机,我能找到的大多数示例代码都使用枚举,我只是想知道它是否比只使用字符串或int来存储状态有优势 使用枚举: 等级交通灯{ 枚举状态{ 红、黄、绿 }) 公共班机{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
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();
}