0

我正在尝试找到一种根据对象状态呈现 UI 按钮(操作)的方法。有没有办法询问状态机:“显示适用于给定状态的事件?” 配置示例:

public class OfcProjectVersionSMConfiguration extends EnumStateMachineConfigurerAdapter<OfcProjectVersionStates, OfcProjectVersionEvents>
....
public void configure(StateMachineTransitionConfigurer<OfcProjectVersionStates, OfcProjectVersionEvents> transitions) throws Exception {
    transitions 
        .withExternal().source(OfcProjectVersionStates.DRAFT).target(OfcProjectVersionStates.DRAFT).event(OfcProjectVersionEvents.U)
        .and()
        .withExternal().source(OfcProjectVersionStates.DRAFT).target(OfcProjectVersionStates.DELETED).event(OfcProjectVersionEvents.D)
        ....
4

2 回答 2

1

我发现这会起作用,但不确定这是正确的方法。

public abstract class GenericEnumStateMachineUtils extends StateMachineUtils {

public static <S, E> Collection<E> findEventsForState(StateMachine<S, E> stateMachine, S state) {
    Collection<E> eventsForState = stateMachine.getTransitions().stream().filter(p -> p.getSource().getId().equals(state)).map(p -> p.getTrigger().getEvent()).collect(Collectors.toCollection(ArrayList::new));
    return eventsForState;
}
于 2016-07-06T09:05:59.983 回答
0

不幸的是,我们没有任何可靠的方法来知道处于特定状态的机器是否适用于处理/接受特定事件。将事件作为枚举,您将知道可能的可能值,但如果事件是字符串,则您将拥有无限的可能值列表,除非您将这些外部存储在列表中。

如果您有深层嵌套的分层状态,其中您可能有不同的事件,并且如果最低活动状态不接受事件,则它会变得更加复杂,然后将其提供给其父状态等等。

麻烦的是,可能会有警卫进行动态评估并询问机器会接受什么事件的问题,就像预测机器将来会做什么一样。

于 2016-07-07T08:01:12.833 回答