状态机的技术选型,yyds!( 二 )

通过反编译后的代码我们看到:OpinionsEnum它继承了java.lang.Enum类;class前的final标识告诉我们此枚举类不能被继承 。
我们接着看它的两个属性:PASS、NOT_PASS 。它们无一例外都经过了staic 的修饰 , 而我们知道staic修饰的属性会在类被加载之后就完成初始化 , 而这个过程是线程安全的 。
示例代码:
public enum State {    SUBMIT_APPLY {        @Override        State transition(String checkcondition) {            System.out.println("员工提交请假申请单,同步流转到部门经理审批 参数 = " + checkcondition);            return Department_MANAGER_AUDIT;        }    },    Department_MANAGER_AUDIT {        @Override        State transition(String checkcondition) {            System.out.println("部门经理审批完成,同步跳转到HR进行审批 参数 = " + checkcondition);            return HR;        }    },    HR {        @Override        State transition(String checkcondition) {            System.out.println("HR完成审批,流转到结束组件, 参数 = " + checkcondition);            return FINAL;        }    },    FINAL {        @Override        State transition(String checkcondition) {            System.out.println("流程结束, 参数 = " + checkcondition);            return this;        }    };    abstract State transition(String checkcondition);}复制代码public class StatefulObjectDemo {    private  State state;    public StatefulObjectDemo() {        state = State.SUBMIT_APPLY;    }    public void performRequest(String checkCondition) {        state = state.transition(checkCondition);    }    public static void main(String[] args) {      StatefulObjectDemo theObject = new StatefulObjectDemo();        theObject.performRequest("arg1");        theObject.performRequest("arg2");        theObject.performRequest("arg3");        theObject.performRequest("arg4");    }}复制代码输出:
员工提交请假申请单,同步流转到部门经理审批 参数 = arg1部门经理审批完成,同步跳转到HR进行审批 参数 = arg2HR完成审批,流转到结束组件, 参数 = arg3流程结束, 参数 = arg4复制代码Java枚举有一个比较有趣的特性即它允许为实例编写方法 , 从而为每个实例赋予其行为 。实现也很简单 , 定义一个抽象的方法即可 , 这样每个实例必须强制重写该方法 。(见示例的transition方法)

经验总结扩展阅读