我之前从未使用过enum State,最近遇到过它,我发现要定义一个FSM,程序员,你知道代码的状态是这样的:
枚举状态{state0,state1,state2}; //程序员定义的具有3种状态的状态机的示例。
但是我希望能够定义一个FSM,用户可以决定其中有多少和哪些状态,有没有办法做到这一点?
答案 0 :(得分:0)
你不能在这里使用具有固定大小的枚举,但我想你可以这样做:
public class StateMachine {
// it is up to you to define what a State and a Transition are
private Set<State> possibleStates;
private Set<Transition> transitions;
private State currentState;
// methods for adding and removing states
// ...
// methods for adding and removing transitions
// ...
}
答案 1 :(得分:0)
不幸的是,没有很好的方法来制作运行时枚举。还有一些其他选择:
使用int表示您的州。这是简单而有效的,但后来可能会让人感到困惑和难以理解,因为int并没有告诉你很多关于状态的含义。通过存储从Integer(state)到String(该状态的描述)的映射可以部分缓解这种情况
创建一个表示状态的不可变类,或者像String一样包装现有的类。使类的实例仅通过静态工厂方法可用,该方法限制给出所需子集的状态,并在内部保留一组所有实例,在工厂方法要求相同状态两次时提供它们。这将是允许通过引用进行相等比较,并为枚举创建类似的语义。
在基于状态决定操作时存在单独的问题(在两个选项上出现),因为状态仅在运行时定义,您不能使用switch语句。线性搜索(相当于链式if语句)与状态数量的差异很小。这个问题可以通过从状态到你想要执行的任何代码创建一个哈希表(或二叉树,如果你愿意)来解决:(Java 8)
HashMap<State, Function<State, State> stateTransitions;
该系统在运行时提供类似枚举的语义,具有相当好的(恒定时间&#34;切换&#34;)效率。