簡體   English   中英

用n個狀態定義FSM的狀態。 (Java)的

[英]Defining states for a FSM with n states. (java)

我以前從未使用過枚舉狀態,最近遇到過它,我發現定義一個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
    // ...    
}

不幸的是,沒有很好的方法來創建運行時枚舉。 但是,還有其他一些選擇:

  1. 使用int表示您的狀態。 這是簡單而有效的方法,但可能會造成混亂,並且以后很難理解,因為int不會告訴您狀態的含義。 通過存儲從Integer(state)到String(該狀態的描述)的映射,可以部分緩解此問題。

  2. 創建一個不可變的類來表示狀態,或包裝一個現有的類,例如String。 僅通過靜態工廠方法使該類的實例可用,該方法將給出的狀態限制為所需的子集,並在內部保留所有實例的集合,以從工廠方法兩次請求相同狀態時提供它們。允許通過引用比較相等性,並創建與枚舉類似的語義。

還有一個單獨的問題(在這兩個選項中都出現),它基於狀態來決定操作,因為狀態僅在運行時定義,因此您不能使用switch語句。 線性搜索(等效於鏈接的if語句)在狀態數方面的伸縮性很差。 通過創建從狀態到要執行的任何代碼的哈希表(或二進制樹,如果需要的話),可以解決此問題:(Java 8)

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

該系統在運行時提供類似枚舉的語義,並具有相當好的(恆定時間“切換”)效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM