【发布时间】:2018-07-16 00:48:22
【问题描述】:
我正在尝试创建一个使用枚举来指定状态的状态机。由于有很多状态并且每个状态实现的逻辑都非常复杂,我想将每个状态与将在不同类中定义的状态处理程序相关联。每个状态处理程序都将实现一个公共接口(或扩展一个公共抽象类),但每个状态处理程序都可能有自己的一组注入依赖项,而其他人可能不需要这些依赖项。到目前为止,是这样的......
StateHandler 接口:
public interface StateHandler {
void onActivation();
void onDeactivation();
}
StateHandler 示例:
@Singleton
public class DefaultStateHandler implements StateHandler {
@Inject
public DefaultStateHandler(SomeDependency someDependency) {...}
/** implement onActivation, onDeactivation and state specific logic **/
}
@Singleton
public class OtherStateHandler implements StateHandler {
@Inject
public OtherStateHandler(SomeOtherDependency someOtherDependency) {...}
/** implement onActivation, onDeactivation and state specific logic **/
}
StateManager 实现:
@Singleton
public class StateManager {
private StateType stateType = StateType.DEFAULT;
@Inject
public StateManager() { }
public void changeState(StateType newStateType) {
if (stateType != newStateType) {
stateType.getStateHandler().onDeactivation();
stateType = newStateType;
stateType.getStateHandler().onActivation();
}
}
}
枚举定义:
public enum StateType {
DEFAULT (/* not sure what to do here */),
OTHER_STATE (...);
private StateHandler stateHandlerInstance;
public getStateHandler { return stateHandlerInstance; }
StateType(/* not sure what to do here */) {
/* assign stateHandlerInstance */
}
}
我想弄清楚的是......在声明关联的枚举时如何注入状态处理程序的特定实例?或者,如果这不可能,是否有另一种方法为每个枚举指定状态处理程序类,然后(在构造函数中或在第一次需要时)获取关联的状态处理程序实例?
【问题讨论】:
-
你看过
@IntoSet和@IntoMap吗? google.github.io/dagger/multibindings.html -
我试过了,但老实说,它超出了我的想象,我什至不确定这是否走在正确的道路上。希望有人能够通过为此用例设计的示例来填补空白。但如果我弄明白了,我会再试一次并发布解决方案!