S2 -> S3 ... SN -> S1 一旦返回到初始状态就停止。 问-6ren">
gpt4 book ai didi

java - 如何使用 Java 枚举实现 "cyclic"FSM

转载 作者:行者123 更新时间:2023-12-02 12:10:49 24 4
gpt4 key购买 nike

我正在尝试实现(使用 Java)有限状态机,但我遇到了以下问题

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

例如S1 -> S2 -> S3 ... SN -> S1

一旦返回到初始状态就停止。

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

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

我希望按如下方式使用枚举:-

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?

最佳答案

  • 为每个州创建一个枚举值。
  • 返回 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 几乎硬编码在枚举中。

关于java - 如何使用 Java 枚举实现 "cyclic"FSM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46563576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com