我正在使用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_QUEST
到QUEST_ACCEPTED
的过渡创建参数。我尝试了以下方法:
TriggerWithParameters1<Quest, GameState, GameTrigger> twp = gameFSM.SetTriggerParameters(GameTrigger.QUEST_FOUND, Quest);
但我不仅不明白如何Fire
此触发器,我也不知道我用该剪辑创建的内容。有人可以告诉我如何使用参数创建和触发该触发器,例如gameFSM.trigger(GameTrigger.QUEST_FOUND, new Quest());
?谢谢!
奖金:为什么StateMachine
课程中的每一种方法都会引发可疑且无能为力的Exception
?我觉得这个库很流利,但使用起来非常糟糕。有什么建议吗?
答案 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);
缺点是您失去了生成点图输出的能力