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 收尾工作...
准备
Enum枚举写的一个简单状态机的更多相关文章
- 只是一个用EF写的一个简单的分页方法而已
只是一个用EF写的一个简单的分页方法而已 慢慢的写吧.比如,第一步,先把所有数据查询出来吧. //第一步. public IQueryable<UserInfo> LoadPagesFor ...
- 写了一个简单的CGI Server
之前看过一些开源程序的源码,也略微知道些Apache的CGI处理程序架构,于是用了一周时间,用C写了一个简单的CGI Server,代码算上头文件,一共1200行左右,难度中等偏上,小伙伴可以仔细看看 ...
- 自己写的一个简单PHP采集器
自己写的一个简单PHP采集器 <?php //**************************************************************** $url = &q ...
- 写了一个简单可用的IOC
根据<架构探险从零开始写javaweb框架>内容写的一个简单的 IOC 学习记录 只说明了主要的类,从上到下执行的流程,需要分清主次,无法每个类都说明,只是把整个主线流程说清楚,避免 ...
- 写了一个简单的 Mybatis
写了一个简单的 Mybatis,取名 SimpleMybatis . 具备增删改查的基本功能,后续还要添加剩下的基本数据类型和Java集合类型的处理. 脑图中有完整的源码和测试的地址 http://n ...
- 利用HttpClient写的一个简单页面获取
之前就听说过利用网络爬虫来获取页面,感觉还挺有意思的,要是能进行一下偏好搜索岂不是可以满足一下窥探欲. 后来从一本书上看到用HttpClient来爬取页面,虽然也有源码,但是也没说用的HttpClie ...
- 今天写了一个简单的新浪新闻RSS操作类库
今天,有位群友问我如何获新浪新闻列表相关问题,我想,用正则表达式网页中取显然既复杂又不一定准确,现在许多大型网站都有RSS集合,所以我就跟他说用RSS应该好办一些. 一年前我写过一个RSS阅读器,不过 ...
- cJSON: 一个用c写的一个简单好用的JSON解析器
转自:http://blog.csdn.net/chenzhongjing/article/details/9188347 下载地址: http://sourceforge.net/projects/ ...
- 基于Spring aop写的一个简单的耗时监控
前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...
随机推荐
- win7下JAVA环境变量配置方法
1.首先,根据自己的需要下载1.6或者1.7的JDK,安装JDK.(安装的时候记一下安装目录,后面会用到) 2.右键计算机→属性→高级系统设置→高级→环境变量,在系统变量部分新建名为"JAV ...
- java 中字符串比较equals()和equalsIgnoreCase()的区别
1.使用equals( )方法比较两个字符串是否相等 boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比较的字符串(String)对象. 如 ...
- awk匹配以aaa开头,以bbb结尾的内容,同时aaa和bbb之间还包含ccc
如果是匹配以A开头,以B结尾的内容,同时A和B之间还包含C的这种怎么做?比如 [root@localhost ~]#cat file aaa grge ddd bbb aaa gege ccc bbb ...
- SQL语句-delete语句
delete语句 delete语句用于删除表中已经存在的整行数据 Tbl_name关键词代表删除数据的目标表 Where子句代表被删除数据的满足条件,如果没有where子句则代 表所有表数据都删除 O ...
- mysql数据库在Linux下安装与配置
mysql是一种开放源代码的关系型数据库系统(RDBMS),使用最常用的数据库管理语言--结构化查询语句(SQL)进行数据库管理. 由于mysql的开源,因此任何人都可以在General Publ ...
- 【原创】源码角度分析Android的消息机制系列(四)——MessageQueue的工作原理
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. MessageQueue,主要包含2个操作:插入和读取.读取操作会伴随着删除操作,插入和读取对应的方法分别为enqueueMessage和ne ...
- Entity Framework VS Mybatis 不同点剖析
大家都知道Entity Framework是.NET系统当中的一个重量级的ORM框架 ,它采用了延迟加载的技术,使得服务端不用每次都去尝试连接数据库,从而增加了使用效率和 减少了不必要的开销.而myb ...
- es随想二
一.es运行状态的监控 es长时间批量入库时,需要对入库的性能进行监控,否则可能导致es重启,入库任务失败. 可以编写shell脚本,每分钟用cat命令监控pending的数量,数量逐渐增大时就需要注 ...
- 自动化测试(二) 单元测试junit的Test注解突然不能使用原因以及解决方案
做为一名刚接触自动化测试的人,才知道单元测试原来也挺有讲究的. 我塞,Test注解报错,没有道理啊~之前好好的,怎么会出现这样~ 原因如下,本人新建了个Test类,报错重名, 难怪提示Test不是注解 ...
- Windows Server 2016-部署第一台域控制器
上节我们提到有关WinSer 2016 Active Directory域服务概述.WinSer2016 AD域中新增的功能及先决条件等,本节就为大家带来WinSer2016下搭建部署第一台域控的操作 ...