如何在stateless4j触发器中发送参数

时间:2014-03-04 19:23:48

标签: java triggers state fsm

我正在使用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?我觉得这个库很流利,但使用起来非常糟糕。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

看起来你遇到了和我一样的挫败感。我能够通过执行以下操作传递参数:

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);

这种方法似乎过于复杂,但确实有效。

答案 1 :(得分:0)

如果使用permitDynamic形式代替permit,则可以使用参数化操作:

TriggerWithParameters1 twp = sm.setTriggerParameters(Trigger.D, java.util.Map.class);
sm.configure(State.D)
    .permitDynamic(
        twp,
        (m) -> State.A, 
        (m) -> System.out.println(m.toString())
    );

Map data = new HashMap();
data.put("a", "1");
sm.fire(twp, data);

缺点是您失去了生成点图输出的能力