Я бы предложил написать enum State
, который представляет каждое доступное состояние и допустимые переходы:
enum State {
G(Collections.emptySet()),
F(Collections.singleton(G)),
M(Collections.singleton(F)),
B(Collections.singleton(M)),
I(Collections.singleton(B)),
W(Collections.singleton(M)),
P(new HashSet<>(Arrays.asList(W, I)));
private final Set<State> validTransitions;
State(final Set<State> validTransitions) {
this.validTransitions = validTransitions;
}
public State transitionTo(final State next) {
if(!validTransitions.contains(next)) {
throw new IllegalStateException();
}
return next;
}
}
NB:
Это позволит толькодля DAG переходов состояний, если вы ссылаетесь на State
в validTransitions
, который еще не был объявлен, вы получите ошибку компилятора " Недопустимая прямая ссылка ".
Я рассматриваю это как преимущество, поскольку оно будет приводить в действие действительный набор состояний во время компиляции, но только , если ваши состояния ациклические .
Если выиспользуете Java 9 +
enum State {
G(Collections.emptySet()),
F(Set.of(G)),
M(Set.of(F)),
B(Set.of(M)),
I(Set.of(B)),
W(Set.of(M)),
P(Set.of(W, I));
private final Set<State> validTransitions;
State(final Set<State> validTransitions) {
this.validTransitions = validTransitions;
}
public State transitionTo(final State next) {
if(!validTransitions.contains(next)) {
throw new IllegalStateException();
}
return next;
}
}