如何实现"循环"带有Java枚举的FSM

时间:2017-10-04 11:22:49

标签: java enums fsm

我正在尝试使用有限状态机器(使用Java)并且我遇到了以下问题

我的要求是我有一个需要循环通过一组已知状态的系统

e.g。 S1 -> S2 -> S3 ... SN -> S1

然后在它恢复到初始状态后停止。

问题在于初始状态可以是任何已知状态,例如S1到SN(并且不受我控制)

无论哪个州开始循环,我都需要确保所有其他州都被“访问”#34;在返回之前以正确的顺序 无论初始状态如何

我希望如下使用Enum: -

https://www.mirkosertic.de/blog/2013/04/implementing-state-machines-with-java-enums/

public enum State {

    INITIAL {
        @Override
        State doSomething(final String aParameter) {
            System.out.println("Doing Something in INITIAL state and jumping to NEXT_STEP, argument = " + aParameter);
            return NEXT_STEP;
        }
    },
    NEXT_STEP {
        @Override
        State doSomething(final String aParameter) {
            System.out.println("Doing Something in NEXT_STEP and jumping into FINAL, argument = " + aParameter);
            return FINAL;
        }
    },
    FINAL {
        @Override
        State doSomething(final String aParameter) {
            System.out.println("I am in FINAL state, argument = " + aParameter);
            return this;
        }
    };

    abstract State doSomething(String aParameter);

}

如何实现循环FSM?

1 个答案:

答案 0 :(得分:1)

  • 为每个州创建一个枚举值。
  • 返回doSomething中的下一个状态。
  • 从某个状态开始,然后使用doSomething循环,直到再次到达。

实际上这将是:

public enum State {

    S1 {
        @Override
        State doSomething() {
            // Do something useful
            return S2;
        }
    },
    S2 {
        @Override
        State doSomething() {
            // Do something useful
            return S3;
        }
    },
    // ...
    SN {
        @Override
        State doSomething() {
            // Do something useful
            return S1;
        }
    },
    abstract State doSomething();
}

然后:

State state = initialState;
do {
    // Do something useful with state
}
while((state = initialState.doSomething()) != initialState);

老实说,我不会像你上面计划的那样成为使用枚举实现FSM的忠实粉丝,因为它使得FSM在枚举中非常硬编码。