JVM | Platform | Status |
---|---|---|
OpenJDK (Temurin) Current | Linux | |
OpenJDK (Temurin) LTS | Linux | |
OpenJDK (Temurin) Current | Windows | |
OpenJDK (Temurin) LTS | Windows |
The jfsm
package provides implementations of finite state machines.
- Mutable enum-based finite state machines.
- Written in pure Java 17.
- High coverage test suite.
- OSGi-ready
- JPMS-ready
- ISC license.
Declare a type that will be used to represent the states of the FSM.
An enum
type or a sealed
hierarchy is a good choice.
enum TrafficLight
{
RED,
YELLOW,
GREEN
}
Declare the allowed state transitions and build an FSM:
final FSMEnumMutableBuilderType<TrafficLight> b =
FSMEnumMutable.builder(TrafficLight.RED);
b.addTransition(TrafficLight.RED, TrafficLight.YELLOW);
b.addTransition(TrafficLight.YELLOW, TrafficLight.GREEN);
b.addTransition(TrafficLight.GREEN, TrafficLight.YELLOW);
b.addTransition(TrafficLight.YELLOW, TrafficLight.RED);
var fsm = b.build();
Execute transitions:
assert TrafficLight.RED == m.current();
m.transition(TrafficLight.YELLOW;
assert TrafficLight.YELLOW == m.current();
m.transition(TrafficLight.GREEN;
assert TrafficLight.GREEN == m.current();
m.transition(TrafficLight.YELLOW;
assert TrafficLight.YELLOW == m.current();
m.transition(TrafficLight.RED;
assert TrafficLight.RED == m.current();
m.transition(TrafficLight.YELLOW;
assert TrafficLight.YELLOW == m.current();
m.transition(TrafficLight.GREEN;
assert TrafficLight.GREEN == m.current();
m.transition(TrafficLight.YELLOW;
assert TrafficLight.YELLOW == m.current();
m.transition(TrafficLight.RED;
assert TrafficLight.RED == m.current();
m.transition(TrafficLight.YELLOW;
assert TrafficLight.YELLOW == m.current();
m.transition(TrafficLight.GREEN;
assert TrafficLight.GREEN == m.current();
The FSM will throw an FSMTransitionException
if an attempt is made to
perform a transition that is not permitted.