2014-03-04 14 views
3

我正在使用stateless4j作爲我的應用程序的有限狀態機庫,但我無法理解如何在觸發觸發器時使用參數。我有以下代碼:如何在stateless4j觸發器中發送參數

gameFSM.Configure(GameState.LOOKING_FOR_A_QUEST) 
    .OnEntry(Actions.lookForQuest) 
    .Permit(GameTrigger.QUEST_FOUND, GameState.JUDGING_QUEST); 

gameFSM.Configure(GameState.JUDGING_QUEST) 
    .OnEntry(Actions.judgeQuest) 
    .Permit(GameTrigger.QUEST_ACCEPTED, GameState.INACTIVE) /* test */ 
    .Permit(GameTrigger.QUEST_DENIED, GameState.LOOKING_FOR_A_QUEST); 

gameFSM.Configure(GameState.INACTIVE) 
    .Permit(GameTrigger.START_LOOKING_FOR_QUESTS, GameState.LOOKING_FOR_A_QUEST); 

現在我試圖創建過渡的參數從LOOKING_FOR_A_QUESTQUEST_ACCEPTED。我試過如下:

TriggerWithParameters1<Quest, GameState, GameTrigger> twp = gameFSM.SetTriggerParameters(GameTrigger.QUEST_FOUND, Quest); 

但我不僅不知道如何後Fire這個觸發,我也沒有一個關於我與剪斷創造什麼線索。有人能告訴我如何使用參數創建並觸發該觸發器,如gameFSM.trigger(GameTrigger.QUEST_FOUND, new Quest());?謝謝!

獎金:爲什麼在StateMachine類每一個方法可以拋出一個可疑的和無能Exception?我覺得這個圖書館非常流利,但使用起來非常糟糕。任何建議?

+0

https://github.com/oxo42/stateless4j我接管了項目的維護,並且接受了不少變化。發送參數仍然很麻煩,但圖書館現在至少感覺良好。 –

回答

3

看起來像你遇到了同樣的挫折,我做了。我能夠通過執行以下操作來傳遞參數:

TriggerWithParameters1 twp = sm.setTriggerParameters(Trigger.D, java.util.Map.class); 
sm.configure(State.D).permit(Trigger.A, State.A) 
        .onEntryFrom(twp, new Action1<Map>(){ 
              public void doIt(Map m) { 
               System.out.println(m.toString()); 
              } 
             }, Map.class); 
Map data = new HashMap(); 
data.put("a", "1"); 
sm.fire(twp, data); 

此方法似乎過於複雜,但它確實有效。

+0

它確實看起來很複雜,但它是確保參數tyes編譯時檢查的唯一方法。 –