stateless4j / stateless4j

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

Crea stato

Introduzione

Crea macchine a stati e flussi di lavoro leggeri basati su macchine a stati direttamente nel codice 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 è una porta di stateless per java

Caratteristiche

La maggior parte dei costrutti di macchine a stati standard sono supportati:

  • Supporto generico per stati e trigger di qualsiasi tipo java (numeri, stringhe, enumerazioni, ecc.)
  • Gerarchica stati
  • di Entrata/uscita degli eventi per gli stati
  • Guardia clausole di supporto condizionale transizioni
  • azioni definite dall’Utente può essere eseguita durante la fase di transizione
  • Interno di transizioni (non si chiama onExit/onEntry)
  • Introspezione

Alcune estensioni utili sono anche previste:

  • Parametrizzare trigger
  • Rientrante stati

Gerarchica Stati

Nell’esempio riportato di seguito, il OnHold stato è il sotto del Connected stato. Ciò significa che è ancora connessa una chiamata OnHold.

phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);

Oltre alla proprietà StateMachine.getState(), che riporterà lo stato corrente preciso, viene fornito un metodo isInState(State). isInState(State) terrà conto delle sottostazioni, in modo che se l’esempio precedente fosse nello statoOnHold, isInState(State.Connected) valuterebbe anche true.

Eventi di entrata/uscita

Nell’esempio, il metodo startCallTimer() verrà eseguito quando viene connessa una chiamata. Il stopCallTimer() verrà eseguito al termine della chiamata (riagganciando o lanciando il telefono contro il muro.)

La chiamata può spostarsi tra gli stati Connected e OnHold senza che i metodi startCallTimer() e stopCallTimer() vengano chiamati ripetutamente perché lo stato OnHold è un sottostato dello stato Connected.

I gestori di eventi Entry/Exit possono essere forniti con un parametro di tipo Transition che descrive gli stati di trigger,origine e destinazione.

Azione sulla transizione

È possibile eseguire un’azione definita dall’utente quando si esegue una transizione.Per una transizione “normale” o “rientrante” questa azione verrà chiamatasenza parametri. Per le transizioni “dinamiche” (quelle che calcolano lo stato di thetarget in base ai parametri dati dal trigger) i parametri del thetrigger saranno dati all’azione.

Questa azione viene eseguita solo se la transizione viene effettivamente eseguita; quindi se la transizione è protetta e la guardia proibisce una transizione, allora l’azione non viene eseguita.

Se viene eseguita la transizione, l’azione verrà eseguita tra il gestoreonExit dello stato corrente e il gestore onEntry dello stato di destinazione (che potrebbe essere lo stesso stato in caso di una transizione rientrante.

Licenza

Apache 2.0 Licenza

Creato da @oxo42

Mantenuto da Chris Narkiewicz @ ezaquarii

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.