<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
Inledning
skapa statliga maskiner och lätta Statliga maskinbaserade arbetsflöden direkt i java-kod.
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());
statslös4j är en port av statslös för java
funktioner
de flesta standard Statliga maskinkonstruktioner stöds:
- generiskt stöd för stater och triggers av alla java-typer (siffror, strängar, enums, etc.)
- hierarkiska tillstånd
- Entry/exit-händelser för tillstånd
- Guard-klausuler för att stödja villkorliga övergångar
- användardefinierade åtgärder kan utföras vid övergång
- interna övergångar (inte anropar
onExit
/onEntry
) - introspektion
några användbara tillägg finns också:
- parametriserade utlösare
- Reentranttillstånd
hierarkiska tillstånd
i exemplet nedan är OnHold
– tillståndet ett substat av Connected
– tillståndet. Det betyder att ett OnHold
– samtal fortfarande är anslutet.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
förutom egenskapen StateMachine.getState()
, som rapporterar det exakta nuvarande tillståndet, tillhandahålls en isInState(State)
– metod. isInState(State)
tar hänsyn till substater, så att om exemplet ovan var iOnHold
– tillståndet, skulle isInState(State.Connected)
också utvärdera till true
.
Entry/Exit-händelser
i exemplet körs metoden startCallTimer()
när ett samtal är anslutet. stopCallTimer()
kommer att utföras när samtalet är klart (genom att antingen hänga upp eller kasta telefonen mot väggen.)
samtalet kan röra sig mellan Connected
och OnHold
stater utan startCallTimer(
) och stopCallTimer()
metoder som anropas upprepade gånger eftersom OnHold
staten är en substate av Connected
tillstånd.
Entry/Exit händelsehanterare kan levereras med en parameter av typen Transition
som beskriver utlösnings -, käll-och destinationstillstånd.
åtgärd vid övergång
det är möjligt att utföra en användardefinierad åtgärd när man gör en övergång.För en’ normal ’eller’ re-entrant ’ övergång kommer denna åtgärd att anropas utan några parametrar. För ’dynamiska’ övergångar (de som beräknar thetarget tillstånd baserat på trigger givna parametrar) parametrarna för thetrigger kommer att ges till åtgärden.
denna åtgärd utförs endast om övergången faktiskt tas; så om övergången är bevakad och vakten förbjuder en övergång, då åtgärden inte exekveras.
om övergången görs kommer åtgärden att utföras mellanonExit
-hanteraren för det aktuella tillståndet och onEntry
– hanteraren för thetarget-tillståndet (vilket kan vara samma tillstånd vid en återinträdesövergång.
Licens
Apache 2.0 licens
skapad av @ oxo42
underhålls av Chris Narkiewicz @ezaquarii