stateless4j/stateless4j

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

 État de construction

Introduction

Créez des machines d’état et des flux de travail légers basés sur des machines d’état directement dans du code 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 est un port sans état pour java

Fonctionnalités

La plupart des constructions de machines à états standard sont prises en charge:

  • Prise en charge générique des états et des déclencheurs de tout type java (nombres, chaînes, énumérations, etc.)
  • États hiérarchiques
  • Événements d’entrée/sortie pour les états
  • Clauses de garde pour prendre en charge les transitions conditionnelles
  • Les actions définies par l’utilisateur peuvent être exécutées lors de la transition
  • Transitions internes (sans appel onExit/onEntry)
  • Introspection

Quelques extensions utiles sont également fournies:

  • Déclencheurs paramétrés
  • États réentrants

États hiérarchiques

Dans l’exemple ci-dessous, l’état OnHold est un sous-état de l’état Connected. Cela signifie qu’un appel OnHold est toujours connecté.

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

En plus de la propriété StateMachine.getState(), qui rapportera l’état actuel précis, une méthode isInState(State) est fournie. isInState(State) prendra en compte les sous-états, de sorte que si l’exemple ci-dessus était dans l’état OnHold, isInState(State.Connected) serait également évalué à true.

Événements d’entrée/sortie

Dans l’exemple, la méthode startCallTimer() sera exécutée lorsqu’un appel est connecté. Le stopCallTimer() sera exécuté une fois l’appel terminé (en raccrochant ou en lançant le téléphone contre le mur.)

L’appel peut se déplacer entre les états Connected et OnHold sans que les méthodes startCallTimer() et stopCallTimer() soient appelées de manière répétée car l’état OnHold est un sous-état de l’état Connected.

Les gestionnaires d’événements d’entrée/sortie peuvent être fournis avec un paramètre de type Transition qui décrit les états de déclenchement, de source et de destination.

Action sur la transition

Il est possible d’exécuter une action définie par l’utilisateur lors d’une transition.Pour une transition « normale » ou « de retour », cette action sera appelée sans aucun paramètre. Pour les transitions « dynamiques » (celles qui calculent l’état cible en fonction des paramètres donnés par le déclencheur), les paramètres du déclencheur seront donnés à l’action.

Cette action n’est exécutée que si la transition est réellement effectuée; donc si la transition est gardée et que la garde interdit une transition, alors l’action n’est pas exécutée.

Si la transition est effectuée, l’action sera exécutée entre le gestionnaire onExit de l’état actuel et le gestionnaire onEntry de l’état cible (qui pourrait être le même état en cas de transition de retour.

Licence

Apache 2.0 Licence

Créée par @oxo42

Maintenue par Chris Narkiewicz @ezaquarii

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.