如何使用 Java 枚举实现 "cyclic" FSM
How to implement a "cyclic" FSM with Java enum
我正在尝试实现(使用 Java)有限状态机,但我遇到了以下问题
我的要求是我有一个需要循环通过一组已知状态的系统
例如S1 -> S2 -> S3 ... SN -> S1
然后在返回初始状态后停止。
问题在于初始状态可以是任何已知状态,例如S1 到 SN(我无法控制)
无论哪个州开始循环,我都需要确保所有其他州 "visited" 在返回之前处于正确的顺序
无论初始状态是什么
我希望使用如下枚举:-
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?
- 为每个州创建一个枚举值。
- Return
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)有限状态机,但我遇到了以下问题
我的要求是我有一个需要循环通过一组已知状态的系统
例如S1 -> S2 -> S3 ... SN -> S1
然后在返回初始状态后停止。
问题在于初始状态可以是任何已知状态,例如S1 到 SN(我无法控制)
无论哪个州开始循环,我都需要确保所有其他州 "visited" 在返回之前处于正确的顺序 无论初始状态是什么
我希望使用如下枚举:-
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?
- 为每个州创建一个枚举值。
- Return
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 几乎硬编码在枚举中。