T - Event Typepublic interface EventWithType<T>
StateMachineBuilder.withEventTypeClassifier(EventTypeClassifier) or
have your Events implement EventWithType.
For example you could implement events in different classes that implement a
common super type and have them return getClass in
getType() to use their classes as actual event types.
public class EventsWithPayload {
public static enum EventType {
COIN,
PUSH;
}
public static class Event implements EventWithType<EventType> {
private final EventType type;
public Event(final EventType type) {
this.type = type;
}
@Override
public EventType getType() {
return this.type;
}
}
public static class Coin extends Event {
final @Getter int amount;
public static final Coin FIFTY_CENTS = new Coin(50);
public static final Coin TWENTY_CENTS = new Coin(20);
public static final Coin TEN_CENTS = new Coin(10);
public Coin(final int amount) {
super(EventType.COIN);
this.amount = amount;
}
}
public static class Push extends Event {
public Push() {
super(EventType.PUSH);
}
}
@Value
public static class CoinSafe {
private final @Wither int amount;
}
public static enum State implements StateWithEnterHandler<Event, CoinSafe> {
LOCKED {
@Override
public CoinSafe onEnter(final Event incomingEvent, final CoinSafe context) {
if (incomingEvent instanceof Coin) {
return context.withAmount(
context.getAmount() + ((Coin) incomingEvent).getAmount());
}
return context;
}
},
UNLOCKED {
@Override
public CoinSafe onEnter(final Event incomingEvent, final CoinSafe context) {
if (incomingEvent instanceof Coin) {
return context.withAmount(
context.getAmount() + ((Coin) incomingEvent).getAmount() - 50);
}
return context;
}
};
}
public static void main(String... args) {
final StateMachineWithContext<State, Event, EventType, CoinSafe> turnstile =
StateMachineBuilder
.createWithContext(
State.class, Event.class, EventType.class, CoinSafe.class)
.transition(State.LOCKED, EventType.COIN, State.UNLOCKED,
"c.amount + e.amount >= 50")
.transition(State.LOCKED, EventType.COIN, State.LOCKED)
.transition(State.UNLOCKED, EventType.PUSH, State.LOCKED)
.transition(State.UNLOCKED, EventType.COIN, State.UNLOCKED)
.build();
final Pair<State, CoinSafe> result = turnstile.run(
Arrays.asList(
Coin.TWENTY_CENTS,
Coin.TWENTY_CENTS,
Coin.TWENTY_CENTS),
new CoinSafe(0));
System.out.println(
Pairs.from(State.UNLOCKED, new CoinSafe(10)), result);
}
| Modifier and Type | Method and Description |
|---|---|
T |
getType()
Get the type of this Event.
|
T getType()
Copyright © 2015. All rights reserved.