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

Java 定义具有n个状态的FSM的状态。(爪哇),java,enums,state,Java,Enums,State,我以前从未使用过enum State,最近也遇到过它,我发现要定义一个FSM,其中程序员知道状态,代码是这样的: 枚举状态{state0,state1,state2}//由程序员定义的具有3种状态的状态机示例 但我希望能够定义一个FSM,其中用户决定有多少个状态以及有什么状态,有什么方法可以做到这一点吗?这里不能使用具有固定大小的枚举,但我想您可以这样做: public class StateMachine { // it is up to you to define what a St

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

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


但我希望能够定义一个FSM,其中用户决定有多少个状态以及有什么状态,有什么方法可以做到这一点吗?

这里不能使用具有固定大小的枚举,但我想您可以这样做:

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
    // ...    
}
公共类状态机{
//由您定义什么是状态和转换
私人设定可能的不动产;
私有集转换;
私人国家;
//添加和删除状态的方法
// ...
//添加和删除转换的方法
// ...    
}

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

  • 使用int表示您的状态。这是简单而有效的,但可能会让人困惑,以后也很难理解,因为int不能告诉你很多关于状态的含义。这可以通过存储从整数(状态)到字符串(该状态的描述)的映射来部分缓解

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

  • 根据状态决定操作有一个单独的问题(这两个选项都会出现),因为状态仅在运行时定义,所以不能使用switch语句。线性搜索,相当于链式if语句,与状态数的比例很差。这个问题可以通过创建一个哈希表(或者二叉树,如果你愿意的话)来解决,从状态到你想要执行的任何代码:(Java8)


    hashmap只有当您知道将有多少个状态时才使用enum。您可以创建某种类型的
    StateMachineBuilder
    ,它接受状态和转换表,但在解耦时可能会变得有点复杂。如果我是你,我会创建某种类型的
    TransitionTable
    类,将状态添加到其中,然后指定状态之间的转换,然后将其添加到基于转换表工作的通用有限状态机中。这只是我的观点,虽然我有一个转换表(存储为带字符串的2D arraylist),我可以在其中添加行+列(状态),单元格nxm将是我存储转换标签的地方,但我也有一系列用于此表的add/get/set方法。我无法将其转换为状态机:/我试着做一些可能的事情;但它似乎不起作用…?不清楚,到底是什么不起作用?在
    集合上调用方法并不难…抱歉,第一次使用集合和状态。集合像列表吗?我应该在.add方法参数中添加什么类型的内容?状态。新?请查看文档。在
    集合
    中,应该添加
    T
    值。但是,如果用户可以自己定义状态,那么您不太可能编写类似于
    State.NEW
    (即编译时已知的枚举)的内容<代码>状态
    通常会包装一些
    字符串
    或其他描述当前状态的类型
    HashMap<State, Function<State, State> stateTransitions;