<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
Bevezetés
hozzon létre állapotgépeket és könnyű állapotgép-alapú munkafolyamatokat közvetlenül java kódban.
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 egy port hontalan java
jellemzők
a legtöbb szabványos állami gép konstrukciók támogatottak:
- Általános támogatás bármely java típusú állapothoz és triggerhez (számok, karakterláncok, enumok stb.)
- hierarchikus állapotok
- belépési / kilépési események
- Guard záradékok a feltételes átmenetek támogatására
- a felhasználó által definiált műveletek végrehajthatók az
- belső átmenetek átállításakor (nem hív
onExit
/onEntry
) - Introspection
néhány hasznos bővítmények is rendelkezésre állnak:
- paraméterezett triggerek
- Reentráns állapotok
hierarchikus állapotok
az alábbi példában a OnHold
állapot a Connected
állapot alállomása. Ez azt jelenti, hogy egy OnHold
hívás még mindig csatlakozik.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
a StateMachine.getState()
tulajdonság mellett, amely a pontos aktuális állapotot jelenti, egy isInState(State)
módszer is rendelkezésre áll. A isInState(State)
figyelembe veszi az alállomásokat, így ha a fenti példaOnHold
állapotban volt, akkor a isInState(State.Connected)
is true
– re értékelné.
belépési/kilépési események
a példában a startCallTimer()
metódus kerül végrehajtásra, amikor egy hívás csatlakozik. A stopCallTimer()
akkor kerül végrehajtásra, amikor a hívás befejeződik (a telefon felakasztásával vagy a falhoz dobásával.)
a hívás mozoghat a Connected
és OnHold
állapotok között anélkül, hogy a startCallTimer(
) és a stopCallTimer()
metódusokat ismételten meghívnák, mert a OnHold
állapot a Connected
állapot alállomása.
a belépési/kilépési eseménykezelők egy Transition
típusú paramétert kaphatnak,amely leírja a kiváltó, a forrás és a célállapotokat.
művelet az átmenet során
lehetséges egy felhasználó által definiált művelet végrehajtása az átmenet során.Egy ‘normál ‘ vagy’ újra belépő ‘ átmenet esetén ez a művelet paraméter nélkül lesz meghívva. A ‘dinamikus’ átmeneteknél (azok, akik a célállapotot a trigger által megadott paraméterek alapján számítják ki) a trigger paraméterei lesznek megadva a műveletnek.
ez a művelet csak akkor kerül végrehajtásra, ha az átmenetet ténylegesen végrehajtják; tehát ha az átmenetet őrzik, és az őr tiltja az átmenetet, akkor a művelet nem kerül végrehajtásra.
ha az átmenet megtörténik, a művelet az aktuális állapotonExit
kezelője és a célállapot onEntry
kezelője között kerül végrehajtásra (amely lehet ugyanaz az állapot újbóli belépéskor.
Licenc
Apache 2.0 licenc
készítette: @ oxo42
karbantartó: Chris Narkiewicz @ezaquarii