Finite state machines
  • Java 99.4%
  • CSS 0.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-07-31 18:42:54 +01:00
.forgejo Update workflows. 2026-07-31 18:42:54 +01:00
com.io7m.jfsm.core Begin next development iteration. 2024-05-11 17:01:56 +00:00
com.io7m.jfsm.tests Begin next development iteration. 2024-05-11 17:01:56 +00:00
src/site/resources Update site metadata. 2025-08-09 15:06:03 +00:00
.gitignore Update .gitignore. 2024-05-07 16:01:43 +00:00
.gitmodules Move to new organization. 2024-04-29 21:51:35 +00:00
doc7m-books.json Add doc7m-books.json 2026-07-31 18:36:45 +01:00
pom.xml Migrate project. 2026-06-27 10:09:38 +01:00
README-CHANGES.xml Mark release 2.0.1 2024-05-11 17:01:46 +00:00
README-LICENSE.txt Update LICENSE 2023-08-13 21:07:23 +00:00
README.in Migrate project. 2026-06-27 10:09:38 +01:00
README.md Migrate project. 2026-06-27 10:09:38 +01:00

jfsm

Maven Central Maven Central (snapshot) Java Version

com.io7m.jfsm

jfsm

The jfsm package provides implementations of finite state machines.

Features

  • Mutable enum-based finite state machines.
  • Written in pure Java 17.
  • High coverage test suite.
  • OSGi-ready.
  • JPMS-ready.
  • ISC license.

Usage

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.