diff --git a/src/main/java/com/serliunx/statemanagement/machine/AbstractStateMachine.java b/src/main/java/com/serliunx/statemanagement/machine/AbstractStateMachine.java index 4cf2f21..c9db829 100644 --- a/src/main/java/com/serliunx/statemanagement/machine/AbstractStateMachine.java +++ b/src/main/java/com/serliunx/statemanagement/machine/AbstractStateMachine.java @@ -269,31 +269,24 @@ public abstract class AbstractStateMachine extends AbstractStateManager im * 触发 */ private void doInvokeHandlers(List> handlerWrappers, S from, S to) { - if (handlerWrappers == null) { + if (handlerWrappers == null) return; - } - // 全局的异步状态 - final boolean isGlobalAsync = async != null && async; - handlerWrappers.forEach(hw -> { final StateHandler stateHandler; if (hw == null || - (stateHandler = hw.getStateHandler()) == null) { + (stateHandler = hw.getStateHandler()) == null) return; - } - - final Executor executorToRun = hw.getExecutor() == null ? executor : hw.getExecutor(); - final boolean runInAsync = hw.getAsync() == null ? isGlobalAsync : hw.getAsync(); final StateHandlerProcessParams params = new StateHandlerProcessParams<>(from, to, null); - - if (runInAsync) { - if (executorToRun == null) { + if (hw.getAsync() == null ? + (this.async != null && this.async) : + hw.getAsync()) { + final Executor executor; + if ((executor = hw.getExecutor() == null ? + this.executor : hw.getExecutor()) == null) throw new NullPointerException(); - } - executorToRun.execute(() -> stateHandler.handle(params)); - } else { + executor.execute(() -> stateHandler.handle(params)); + } else stateHandler.handle(params); - } }); } } diff --git a/src/main/java/com/serliunx/statemanagement/manager/BreakageUnidirectionalStateManager.java b/src/main/java/com/serliunx/statemanagement/manager/BreakageUnidirectionalStateManager.java index 66017a7..fe6ed38 100644 --- a/src/main/java/com/serliunx/statemanagement/manager/BreakageUnidirectionalStateManager.java +++ b/src/main/java/com/serliunx/statemanagement/manager/BreakageUnidirectionalStateManager.java @@ -70,7 +70,11 @@ public final class BreakageUnidirectionalStateManager extends DefaultUnidirec @Override public boolean switchTo(S state) { - if (isLast()) { + /* + * 非最后一个状态且切换后的状态必须在当前状态的下位 + */ + if (isLast() || + indexOf(state) <= currentIndex()) { if (allowThrow) throw new StateException("The last state has been reached and cannot be switched again!"); return false;