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

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 收尾工作...
准备

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

  1. 只是一个用EF写的一个简单的分页方法而已

    只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...

  2. 写了一个简单的CGI Server

    之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看 ...

  3. 自己写的一个简单PHP采集器

    自己写的一个简单PHP采集器 <?php //**************************************************************** $url = &q ...

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

    之前就听说过利用网络爬虫来获取页面,感觉还挺有意思的,要是能进行一下偏好搜索岂不是可以满足一下窥探欲. 后来从一本书上看到用HttpClient来爬取页面,虽然也有源码,但是也没说用的HttpClie ...

  5. cJSON: 一个用c写的一个简单好用的JSON解析器

    转自:http://blog.csdn.net/chenzhongjing/article/details/9188347 下载地址: http://sourceforge.net/projects/ ...

  6. 基于Spring aop写的一个简单的耗时监控

    前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...

  7. 写了一个简单的NodeJS实现的进程间通信的例子

    1. cluster介绍 大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算.所以,有人开发了第三方的cluster,让node可以利用多核CPU ...

  8. 用Objective-C写了一个简单的批量更改文件名的程序

    前言:因为本人要高仿一个app,从app中解压asserts得到的所有图片文件,文件名都带有~iPhone这个干扰的名字,为了去除这个~iPhone这个字符串,所以本人写了个简答的批量更改所有文件名的 ...

  9. [原创]用python写了一个简单的markdown编辑器

    以前我常用openoffice记录东西,最喜欢它的当然是在linux上能用了,还有里面的公式输入,前几天才了解markdown这个东东,初步了解发现它正是我需要的东西,可以用它随心所欲地记录些东西,而 ...

随机推荐

  1. Java--JDK动态代理核心源码解析

    1.首先我们了解一下JDK动态代理的使用方法: public static void main(String[] args) { /** * 创建一个Bean对象,该对象实现BeanInterFace ...

  2. [drp 6]接口和抽象类的区别,及其应用场景

    导读:在很多时候,接口和抽象类可以替换.发现这个问题,还是之前学习设计模式的时候,看到那个UML图发现的.那么,究竟在什么时候使用接口,什么时候使用抽象类呢?现在结合这个项目,做一个总结. 一.接口 ...

  3. MyEclipse默认标签TODO,XXX,FIXME和自定义标签的使用

    MyEclipse默认标签TODO,XXX,FIXME和自定义标签的使用 MyEclipse中的一些特殊的注释技术包括:1.    // TODO —— 表示尚未完成的待办事项.2.    // XX ...

  4. busybox下mount nfs的命令

    busybox下mount nfs的命令 mount -f nfs -o nolock 10.130.30.2:/nfs/nuc970/rootfs /mnt/test

  5. (转)VS无法启动调试:“生成下面的模块时,启用了优化或没有调试信息“

    中调试项目遇到错误提示,Visual Studio 2010(或VS2008或VS2005)启动调试的时候,弹出提示信息: 生成下面的模块时,启用了优化或没有调试信息: C:\WINDOWS\Micr ...

  6. VirtualBox中的Ubuntu没有权限访问共享文件夹/media/sf_bak

    之前已经搞定可以自动共享文件夹了,但是现在发现无法去访问,非root用户下,使用“ls /media/sf_bak”提示没有权限,当然如果切换到root,是可以的. [解决过程]1.把普通用户名加入到 ...

  7. jQuery Easy UI Resizable(调整大小)组件

    Resizable(调整大小)组件,easyui基础组件之中的一个.调整大小就是能够对元素能够拖着调整大小,这个组件不依赖于其它组件,使用比較简单,相关的属性.事件都 在样例中介绍了. 演示样例: & ...

  8. 解决火狐中用JQUERY .removeAttr()无法去除元素属性的方法

    //为元素添加只读属性 $("#test").attr("readonly","readonly") //去除元素的只读属性 $(" ...

  9. Python内置函数(48)——__import__

    英文文档: __import__(name, globals=None, locals=None, fromlist=(), level=0) This function is invoked by ...

  10. Mysql变量列表

    变量表解释 (https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html)