编程语言
首页 > 编程语言> > java-在FSM中使用枚举比仅使用字符串有好处吗?

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