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

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. 今天写了一个简单的新浪新闻RSS操作类库

    今天,有位群友问我如何获新浪新闻列表相关问题,我想,用正则表达式网页中取显然既复杂又不一定准确,现在许多大型网站都有RSS集合,所以我就跟他说用RSS应该好办一些. 一年前我写过一个RSS阅读器,不过 ...

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

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

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

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

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

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

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

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

随机推荐

  1. OpenCASCADE Linear Extrusion Surface

    OpenCASCADE Linear Extrusion Surface eryar@163.com Abstract. OpenCASCADE linear extrusion surface is ...

  2. java中的对象,类。与 方法的重载。

    对象: 一切皆为对象.对象包括两部分内容:属性(名词形容词),行为(动词).对象和对象之间是有关系的: 派生,关联,依赖. 类: 对同一类别的众多对象的一种抽象.类,还是用来生成对象的一种模板,对象是 ...

  3. IDEA 分享项目到 Git@OSC/GitHub

    前提:新开项目,需要在 Git@OSC 建立版本库管理. 1.当然是先在Git@OSC上创建仓库,拿到Git@OSC仓库的HTTP连接 https://git.oschina.net/*****/** ...

  4. WLAN信道

  5. Make Blog Beautiful

    想做一个文艺而专业的编程技术博客 :) 博客定位 编程大观园,正如其名,探索和汇萃各种编程思想.技术.技能.技巧,并融入自己对编程开发.产品研发的思考和探索. 分类与标签      好的博客分类能让访 ...

  6. oracle学习 十一 包+复合类型+自定义异常(持续更新)

    在这里讲一下包的概念, 二话不说上个例子 包头: create or replace package pck_test is procedure proc_report_salary(name nva ...

  7. LFM 隐语义模型

    隐语义模型: 物品       表示为长度为k的向量q(每个分量都表示  物品具有某个特征的程度) 用户兴趣 表示为长度为k的向量p(每个分量都表示  用户对某个特征的喜好程度) 用户u对物品i的兴趣 ...

  8. Java学习之链表

    数据结构学了,java实现下 package com.gh.Link; /** * 链表的实现 * @author ganhang * */ public class Links { public s ...

  9. nodejs http post 请求带参数

    // We need this to build our post string var querystring = require('querystring'); var http = requir ...

  10. cocos 动画系统

    前面的话 cocos 动画系统支持任意组件属性和用户自定义属性的驱动,再加上可任意编辑的时间曲线和移动轨迹编辑功能,就可以制作出各种动态效果 概述 Animation 组件可以以动画方式驱动所在节点和 ...