Enum枚举写的一个简单状态机

今天下雨,心情有点压抑,所以用枚举写个状态机排解一下心情,顺便记录一下枚举使用方法.

package statemachine;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author ZhenWeiLai
 *
 */
public enum StateEnum {

    READY("1", "准备"){
        @Override
        void submit(Entity entity) {
            super.submit(entity);
            //重写更新状态方法,加入自己的业务逻辑
            System.out.println("Ready submit 收尾工作...");
        }
    },
    START("2", "开始"){
        @Override
        void undo(Entity entity) {
            super.undo(entity);
            System.out.println("Start undo 收尾工作...");
        }
    },
    RUN("3", "运行"),
    STOP("4", "停止");

    //状态代码
    private String code;
    //状态名称
    private String name;

    //构造方法
    StateEnum(String code, String name){
        this.code = code;
        this.name = name;
        //构造时把代码注册进列表
        StateList.stateList.add(code);
    }

    //更新状态的方法,如果更新状态需要做什么其他操作,那么重写该方法,然后super调用,再加入自己逻辑
    void submit(Entity entity) {
        if (entity.getState() == null && !this.getCode().equals(READY.getCode()))
            throw new RuntimeException("状态不合法");
        else if(entity.getState() == null && this.getCode().equals(READY.getCode())){
            entity.setState(StateList.stateList.get(0));
            return;
        }

        if(!StateList.stateList.get((StateList.stateList.indexOf(entity.getState())+1)).equals(this.code))
            throw new RuntimeException("状态不合法");

        if(StateList.stateList.contains(this.code)){
            entity.setState(this.code);
        }
    }

    //反操作方法,与提交方法同理
    void undo(Entity entity) {
        //如果当前没有状态,也不是当前枚举状态,那么抛出异常
        if (entity.getState() == null||!entity.getState().equals(this.code))
            throw new RuntimeException("状态不合法");
        //判断是否已经注册进列表的合法状态
            if(StateList.stateList.contains(this.code)){
                Integer codeIndex = StateList.stateList.indexOf(this.code);
                //如果不是初始化状态,那么回退一个状态,否则设置为null
                if(codeIndex>0)
                    entity.setState(StateList.stateList.get(--codeIndex));
                else
                    entity.setState(null);
            }
    }

    //根据code获取状态名称
    public static String getNameByCode(String code){
        for(StateEnum item : StateEnum.values()){
            if(item.getCode().equals(code)){
                return item.getName();
            }
        }
         return "";
    }

    /**
     *
     * @author ZhenWeiLai
     * 静态内部类,挺环保的,为了使用这个静态list
     * 因为枚举构造方法不能调用静态属性,原因不明,知道的人请告诉我一声
     */
    static class StateList{
        private static List<String> stateList = new ArrayList<>();
    }

    //------------------------------------------------------getter setter-------------------------------------------------------------------------

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
package statemachine;

/**
 *
 * @author ZhenWeiLai
 * 实体
 */
public class Entity {
    //状态code
    private String state;

    /**
     * 获取状态code转译
     * @return
     */
    public String getStateName(){
        return StateEnum.getNameByCode(this.state);
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
}
package statemachine;

/**
 *
 * @author ZhenWeiLai
 *
 */
public class TestClass {

    /**
     * 测试方法
     * @param args
     */
    public static void main(String[] args) {
        Entity entity = new Entity();

        StateEnum.READY.submit(entity);
        System.out.println(entity.getStateName());
        StateEnum.START.submit(entity);
        System.out.println(entity.getStateName());
        StateEnum.RUN.submit(entity);
        System.out.println(entity.getStateName());
        StateEnum.STOP.submit(entity);
        System.out.println(entity.getStateName());

        StateEnum.STOP.undo(entity);
        System.out.println(entity.getStateName());
        StateEnum.RUN.undo(entity);
        System.out.println(entity.getStateName());
        StateEnum.START.undo(entity);
        System.out.println(entity.getStateName());
        StateEnum.READY.undo(entity);
        System.out.println(entity.getStateName());

    }
}

控制台输出结果:

Ready submit 收尾工作...
准备
开始
运行
停止
运行
开始
Start undo 收尾工作...
准备
时间: 2024-08-30 14:36:35

Enum枚举写的一个简单状态机的相关文章

虚幻4,BP写了一个简单的三线跑酷工程

BP写了一个简单的三线跑酷 链接: http://pan.baidu.com/s/1jILE4V8 密码: 96ua

java写的一个简单学生管理系统[改进]

用Java写的一个简单学生管理系统 import java.util.*; public class student_cj {  public static void main(String[] args){      Scanner in=new Scanner(System.in);   System.out.print("请输入学生人数:");   int num=in.nextInt();//学生人数   String[] str=new String[num];//结合一行数

写了一个简单的CGI Server

之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看,对于学生来说,拿来当简历,含金量还是足够的.如果把程序里所涉及的HTTP协议,Linux下POSIX编程等等搞清楚,我想找工作中肯定是有足够的竞争力的,当然我也只是皮毛而已,不再班门弄斧了,下面简单的说下程序流程吧,方便小伙伴们阅读. 程序源代码:戳我 在说程序流程之前,我先简单说下CGI吧,CG

用qt写的一个简单到不能在简单的上位机

学QT时,写的一个简单得不能再简单的串口上位机,用来控制单片机上的2个LED.假设一个是只有开和关的状态.一个可以调节亮度.上位机的界面如下图: 其中,波特率,数据位,停止位下拉值在设计师里面添加.剩下的功能,基本由代码实现.通信使用的协议也是随便写的.很简单和随意.图片是老弟手绘的. 下面贴代码 (*^__^*) #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort

写的一个简单定时器(非独立线程)

//Callback.h #ifndef __CALLBACK_H__ #define __CALLBACK_H__ typedef void (*T_CallBack)(void *); typedef struct { T_CallBack cb; void *obj; }ST_CallBack; int __NewTimer(void* obj, int interval, bool isloop, T_CallBack cb); void __DeleteTimer(int handle

写了一个简单可用的IOC

根据<架构探险从零开始写javaweb框架>内容写的一个简单的 IOC 学习记录    只说明了主要的类,从上到下执行的流程,需要分清主次,无法每个类都说明,只是把整个主线流程说清楚,避免陷入细节中.学习过程最大的收获,框架也是人写的,没学过感觉很神秘高端.现在看来大概率是,未知往往觉得是高不可攀.http://naotu.baidu.com/file/6c3da879a4495b6bd369f71dcb726f05?token=ed8c0d49d4ee7bbd 原文地址:https://ww

浮动布局写了一个简单的页面

正在学习的路上...... 这两天写了一个比较简单的页面,主要使用了浮动和定位.左边的属于滚动页面,右边的list属于固定.先上图片: 主要使用了float:left/right. 1.下面是HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <link type="

写了一个简单的jquery插件(初恋啊)

用了好久的jquery了,却没有写过插件,今天研究了一个别人的插件和一些文章,总算搞清楚了jquery插件一些写法, 代码写了一个div当鼠标事件发生时的宽高变化情况,基础,代码基础,基础好了,才能研究深入的东西. 1 (function(jQuery){ 2 /* 3 * 插件应该返回一个JQuery对象,以便保证插件的可链式操作. 4 * JQuery插件的机制:jQuery提供了2个用于扩展jQuery功能的方法 5 * jQuery.fn.extend() 6 * jQuery.exte

利用HttpClient写的一个简单页面获取

之前就听说过利用网络爬虫来获取页面,感觉还挺有意思的,要是能进行一下偏好搜索岂不是可以满足一下窥探欲. 后来从一本书上看到用HttpClient来爬取页面,虽然也有源码,但是也没说用的HttpClient是哪个版本的,而且HttpClient版本不一样,导致后面很多类也不一样.于是下载了最新的HttpCient版本,并且对着tutorial和网上的文档试着写一个简单的获取页面的例子,最终证明是可行的,但是也遇到了不少问题,而且这个例子也十分简单. import java.io.IOExcepti