如何使用Java枚举实现“循环”FSM

如何使用Java枚举实现“循环”FSM,java,enums,fsm,Java,Enums,Fsm,我试图用Java实现一个有限状态机,我遇到了以下问题 我的要求是,我有一个系统,需要循环通过一组已知的状态 e、 g.S1->S2->S3。。。序号->S1 然后在它返回到初始状态后停止 问题是初始状态可以是任何已知状态,例如S1到SN,并且不受我的控制 无论哪个状态开始循环,我都需要确保在返回之前以正确的顺序访问所有其他状态 无论初始状态是什么 我希望使用以下Enum:- 如何实现循环FSM 每个状态创建一个枚举值。 返回doSomething中的下一个状态。 从某种状态开始,循环使用剂量测定

我试图用Java实现一个有限状态机,我遇到了以下问题

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

e、 g.S1->S2->S3。。。序号->S1

然后在它返回到初始状态后停止

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

无论哪个状态开始循环,我都需要确保在返回之前以正确的顺序访问所有其他状态 无论初始状态是什么

我希望使用以下Enum:-

如何实现循环FSM

每个状态创建一个枚举值。 返回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();
}
然后:


老实说,我不太喜欢像你上面计划的那样用enum实现FSM,因为它使FSM在enum中几乎是硬编码的。

谢谢你,我想你是想让S2返回S3
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);