<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
Úvod
vytvářejte stavové stroje a pracovní postupy založené na lehkých stavových strojích přímo v kódu java.
StateMachineConfig<State, Trigger> phoneCallConfig = new StateMachineConfig<>();phoneCallConfig.configure(State.OffHook) .permit(Trigger.CallDialed, State.Ringing);phoneCallConfig.configure(State.Ringing) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.CallConnected, State.Connected);// this example uses Java 8 method references// a Java 7 example is provided in /examplesphoneCallConfig.configure(State.Connected) .onEntry(this::startCallTimer) .onExit(this::stopCallTimer) .permit(Trigger.LeftMessage, State.OffHook) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PlacedOnHold, State.OnHold);// ...StateMachine<State, Trigger> phoneCall = new StateMachine<>(State.OffHook, phoneCallConfig);phoneCall.fire(Trigger.CallDialed);assertEquals(State.Ringing, phoneCall.getState());
stateless4j je port bez státní příslušnosti pro Javu
funkce
většina standardních stavových strojů konstrukty jsou podporovány:
- obecná podpora stavů a spouštěčů libovolného typu java (čísla ,řetězce, enumy atd.
- hierarchické stavy
- vstupní / výstupní události pro stavy
- ochranné klauzule pro podporu podmíněných přechodů
- uživatelem definované akce mohou být provedeny při přechodu
- interní přechody (nevyvolávají
onExit
/onEntry
) - introspekce
některé užitečné rozšíření jsou také k dispozici:
- parametrizované spouštěče
- reentrantní stavy
hierarchické stavy
v níže uvedeném příkladu je stav OnHold
substatem stavu Connected
. To znamená, že volání OnHold
jestále připojeno.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
kromě vlastnosti StateMachine.getState()
, která bude hlásit přesný aktuální stav, je k dispozici metoda isInState(State)
. isInState(State)
bude brát rozvodny v úvahu, takže pokud by výše uvedený příklad byl ve stavuOnHold
, isInState(State.Connected)
by také vyhodnotil na true
.
vstupní/výstupní události
v příkladu bude metoda startCallTimer()
provedena při připojení hovoru. stopCallTimer()
bude beexecuted po dokončení hovoru (buď zavěšením nebo hodením telefonu proti zdi.)
volání se může pohybovat mezi stavy Connected
a OnHold
, aniž by byly opakovaně volány metody startCallTimer(
) a stopCallTimer()
, protože stav OnHold
je substate stavu Connected
.
obsluha vstupních / výstupních událostí může být dodávána s parametrem typu Transition
, který popisuje spouštěcí, zdrojové a cílové stavy.
akce na přechodu
při provádění přechodu je možné provést uživatelem definovanou akci.Pro „normální“ nebo „opětovný“ přechod bude tato akce volánabez jakýchkoli parametrů. U „dynamických“ přechodů (těch, kteří počítají stav Targetu na základě parametrů daných spouštěčem) budou parametry thetrigger dány akci.
tato akce se provádí pouze tehdy, pokud je přechod skutečně proveden; pokud je tedy přechod hlídán a stráž zakazuje přechod, pak se akce neprovede.
pokud je přechod proveden, bude akce provedena mezi onExit
handler aktuálního stavu a onEntry
handler stavu target (což může být stejný stav v případě opětovného vstupu.
Licence
Apache 2.0 Licence
vytvořil @oxo42
udržuje Chris Narkiewicz @ezaquarii