<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
Introducere
creați mașini de stat și fluxuri de lucru ușoare bazate pe mașini de stat direct în codul 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());
apatrid4j este un port de apatrid pentru java
caracteristici
cele mai multe construcții de mașini de stat standard sunt acceptate:
- suport Generic pentru statele și declanșează de orice tip java (numere, siruri de caractere, enums, etc.)
- stări ierarhice
- evenimente de intrare/ieșire pentru state
- clauze de protecție pentru a sprijini tranzițiile condiționale
- acțiunile definite de utilizator pot fi executate la tranziția
- tranziții interne (nu apelare
onExit
/onEntry
) - introspecție
unele extensii utile sunt, de asemenea, furnizate:
- declanșatoare parametrizate
- stări Reintratoare
stări ierarhice
în exemplul de mai jos, starea OnHold
este o substată a stării Connected
. Aceasta înseamnă că este un apel OnHold
încă conectat.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
în plus față de proprietatea StateMachine.getState()
, care va raporta starea curentă precisă, este furnizată o metodă isInState(State)
. isInState(State)
va lua în considerare substatele, astfel încât, dacă exemplul de mai sus ar fi în stareaOnHold
, isInState(State.Connected)
ar evalua, de asemenea, la true
.
evenimente de intrare/ieșire
în exemplu, metoda startCallTimer()
va fi executată atunci când este conectat un apel. stopCallTimer()
va fiexecutat când se termină apelul (fie prin agățarea, fie prin aruncarea telefonului pe perete.)
apelul se poate deplasa între stările Connected
și OnHold
fără ca metodele startCallTimer(
) și stopCallTimer()
să fie apelate în mod repetat, deoarece starea OnHold
este o substată a stării Connected
.
manipulatoarele de evenimente de intrare/ieșire pot fi furnizate cu un parametru de tip Transition
care descrie stările de declanșare,sursă și destinație.
acțiune în tranziție
este posibil să executați o acțiune definită de utilizator atunci când faceți o tranziție.Pentru o tranziție ‘normală’ sau ‘reintrare’, această acțiune va fi apelatăfără parametri. Pentru tranzițiile ‘dinamice’ (cei care calculează starea țintă pe baza parametrilor declanșatori) parametrii declanșatorului vor fi acordați acțiunii.
această acțiune este executată numai dacă tranziția este efectiv realizată; deci, dacă tranziția este păzită și gardianul interzice o tranziție, atunci acțiunea nu este executată.
dacă se face tranziția, acțiunea va fi executată între operatorulonExit
al stării curente și operatorul onEntry
al statului țintă (care ar putea fi aceeași stare în cazul unei tranziții reintrare.
Licență
Apache 2.0 Licență
creată de @ oxo42
întreținută de Chris Narkiewicz @ ezaquarii