<dependency> <groupId>com.github.stateless4j</groupId> <artifactId>stateless4j</artifactId> <version>2.6.0</version> </dependency>
wprowadzenie
twórz maszyny stanowe i lekkie przepływy pracy oparte na maszynach stanowych bezpośrednio w kodzie 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 jest portem bezstanowym dla Javy
funkcje
większość standardowych konstrukcji maszyn stanowych jest obsługiwana:
- ogólne wsparcie dla stanów i wyzwalaczy dowolnego typu java (liczby, ciągi znaków, wyliczenia itp.
- Stany hierarchiczne
- zdarzenia wejścia/wyjścia dla Stanów
- klauzule Guard obsługujące przejścia warunkowe
- akcje zdefiniowane przez Użytkownika mogą być wykonywane podczas przejścia
- przejścia wewnętrzne (nie wywołanie
onExit
/onEntry
) - introspekcja
dostępne są również przydatne rozszerzenia:
- parametryzowane wyzwalacze
- Stany Recentracyjne
Stany hierarchiczne
w poniższym przykładzie stan OnHold
jest stanem podrzędnym stanu Connected
. Oznacza to, że połączenie OnHold
jest nadal podłączone.
phoneCall.configure(State.OnHold) .substateOf(State.Connected) .permit(Trigger.TakenOffHold, State.Connected) .permit(Trigger.HungUp, State.OffHook) .permit(Trigger.PhoneHurledAgainstWall, State.PhoneDestroyed);
oprócz właściwości StateMachine.getState()
, która będzie raportować dokładny aktualny stan, dostępna jest metoda isInState(State)
. isInState(State)
weźmie pod uwagę podstaty, więc jeśli powyższy przykład był w stanieOnHold
, isInState(State.Connected)
również obliczy do true
.
zdarzenia wejścia/Wyjścia
w przykładzie metoda startCallTimer()
zostanie wykonana, gdy połączenie zostanie połączone. Telefon stopCallTimer()
zostanie wyłączony po zakończeniu połączenia (przez powieszenie lub rzucenie telefonem o ścianę.)
wywołanie może poruszać się między Stanami Connected
i OnHold
bez wielokrotnego wywoływania metod startCallTimer(
) i stopCallTimer()
, ponieważ stan OnHold
jest stanem podrzędnym stanu Connected
.
obsługa zdarzeń wejścia/Wyjścia może być dostarczona z parametrem typu Transition
, który opisuje stan wyzwalacza, źródła i przeznaczenia.
akcja przy przejściu
podczas przejścia można wykonać akcję zdefiniowaną przez użytkownika.W przypadku przejścia „normalnego” lub „ponownego uczestnictwa” działanie to będzie nazywane bez żadnych parametrów. Dla „dynamicznych” przejść (tych, którzy obliczają stan ładunku na podstawie parametrów wyzwalanych) parametry triggera zostaną przekazane akcji.
ta akcja jest wykonywana tylko wtedy, gdy przejście jest rzeczywiście wykonane; więc jeśli przejście jest strzeżone, a strażnik zabrania przejścia, wtedy akcja nie jest wykonywana.
jeśli przejście zostanie wykonane, akcja zostanie wykonana między onExit
obsługą stanu bieżącego a onEntry
obsługą stanu obecnego (który może być tym samym stanem w przypadku ponownego wejścia.
Licencja
Apache 2.0 Licencja
Created by @ oxo42
utrzymywana przez Chris Narkiewicz @ezaquarii