定义具有n个状态的FSM的状态。 (Java)的

时间:2014-11-12 23:48:28

标签: java enums state

我之前从未使用过enum State,最近遇到过它,我发现要定义一个FSM,程序员,你知道代码的状态是这样的:

  

枚举状态{state0,state1,state2}; //程序员定义的具有3种状态的状态机的示例。

但是我希望能够定义一个FSM,用户可以决定其中有多少和哪些状态,有没有办法做到这一点?

2 个答案:

答案 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)

不幸的是,没有很好的方法来制作运行时枚举。还有一些其他选择:

  1. 使用int表示您的州。这是简单而有效的,但后来可能会让人感到困惑和难以理解,因为int并没有告诉你很多关于状态的含义。通过存储从Integer(state)到String(该状态的描述)的映射可以部分缓解这种情况

  2. 创建一个表示状态的不可变类,或者像String一样包装现有的类。使类的实例仅通过静态工厂方法可用,该方法限制给出所需子集的状态,并在内部保留一组所有实例,在工厂方法要求相同状态两次时提供它们。这将是允许通过引用进行相等比较,并为枚举创建类似的语义。

  3. 在基于状态决定操作时存在单独的问题(在两个选项上出现),因为状态仅在运行时定义,您不能使用switch语句。线性搜索(相当于链式if语句)与状态数量的差异很小。这个问题可以通过从状态到你想要执行的任何代码创建一个哈希表(或二叉树,如果你愿意)来解决:(Java 8)

    HashMap<State, Function<State, State> stateTransitions;
    

    该系统在运行时提供类似枚举的语义,具有相当好的(恒定时间&#34;切换&#34;)效率。