apatrid4j / apatrid4j

 <dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>

construiți starea

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

Lasă un răspuns

Adresa ta de email nu va fi publicată.