I’ve written a state machine for navigating an automated telephone system, where each state is represented by its own Java class file, for a total of 50+ classes. Rather than write the instantiation and factory code myself, I decided to use Spring for bean definition and dependency injection. This works fine, however I have lost compile-time type checking by moving from:
State next = getState(Instructions.class);
to
ApplicationContext ctx = ...
State next = ctx.getBean("instructions", State.class);
Instead of having compiler checks that I’ve specified a real, existing state, I now have to rely on the id being spelled properly in both my source code and the bean xml.
Is there a better way to do this? I haven’t worked extensively with Spring since early 2.0 days, so I don’t have much real world experience to draw on. What are the drawbacks and advantages of this approach? Is there is something extra I could to to verify proper id strings are used?
Turn off lazy initialization of Spring, and you’ll at least cure the type safety department. You could also consider a ‘grand central station’ bean into which all of the states are inserted by name, this resulting in a yell if any go missing. You can still mispell in your Java code.