<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
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