... my question is more around how I should change the design to avoid needing this circular dependency. – Jordan
One method I've seen is to have each state construct the next state. That works but feels like it's abusing the garbage collector. Here's a method that lets you bounce back and forth from two immutable states.
interface State {
boolean process(Context context);
}
enum States implements State {
A {
public boolean process(Context context) {
System.out.println(States.A);
context.setState(States.B);
return true;
}
},
B {
public boolean process(Context context) {
System.out.println(States.B);
context.setState(States.A);
return true;
}
}
}
class Context{
State state;
public Context(State state) {
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
class Processor {
public void process(Context context) {
while(context.getState().process(context));
}
}
public class EntryPoint {
public static void main(String[] args) {
Processor p = new Processor();
Context cd = new Context(States.A);
p.process(cd);
}
}
Inspired by this