前言

相信不少java开发者写过状态变更的业务,比如订单流程、请假流程等等。一般会搞一个状态标识来标识生命周期的某个阶段。很多人会写这种逻辑:

如果流程几十个岂不是要if到爆炸。还有这“0”、“1”是几个意思?

优化的办法当然可以使用设计模式中的状态模式来搞,允许一个具有状态的对象根据其状态封装同一对象的不同行为。我们可以编程状态之间的转换,然后定义单独的状态:

但是这种操作会增加过多的状态对象依赖。那么有没骚操作呢?当然有。我们先来了解了解状态机。

状态机

状态机全称有限状态机,因为一般的状态机的状态都是离散而且可枚举的,这就是有限的原因。状态机表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。通俗的描述状态机就是定义了一套状态変更的流程:状态机包含一个状态集合,定义当状态机处于某一个状态的时候它所能接收的事件以及可执行的行为,执行完成后,状态机所处的状态变化可以被感知。一般包含以下几个概念:

状态 太废话了我,状态机没有状态还能叫状态机。

事件 状态机的状态变更肯定是通过触发一个事件引起的。

行为 触发了之后执行的业务逻辑。比如说订单未支付状态到支付状态的变更需要走的业务,写流水、修改账户余额等。

变更 一个状态被一个事件触发执行了某些行为到达了另外一个状态的过程。

上图就是个变更的过程示意。接下来该说另一个东西java枚举了。

Java中的枚举

一个Java的枚举是一种定义的一类常量列表的特殊类型的类。是JDK 1.5中引入的新特性。 枚举在JDK中其实就是被设计成了单例模式,所以是不允许外部对其进行实例化的,枚举类型的实例化都是在其加载的时候JVM帮我们完成的。这是Java虚拟机规范明确规定的,保证了线程的安全性。由于Java枚举隐式实现了枚举超类java.lang.Enum,因此无法实现另一个类,但是可以实现接口。可以声明抽象方法由具体的内部枚举来实现。我们定义一个颜色枚举来看看:

我们可以通过 Colorful.RED.colorName() 直接拿到颜色的名称,非常方便而且语义化。

接下来我们将结合实际开发场景来实现一个简单枚举类型的状态机来处理业务。

实战操作

订单派送到收货这个场景,我们考虑如下单纯的场景:

经历调度到派送最后到收货这个简单过程,我们可以定义如下状态枚举:

因为调度是初始状态,所以其prevState方法指向自己,因为收货时终止状态所以其nextState指向自己。通过定义这两个指针来进行操作所需要的流程。当然实际生产要结合你自己的业务来做。

然后我们订单流程就可以这样搞(省略getter和setter):

我们来简单测试一下:

经过两次的流转,货物成功到达买家的手中,状态也正确的进行了变更,而且可维护性也得到了保证,只需要变更枚举流程。好了今天就到这里,希望大家多多关注。

关注公众号:码农小胖哥 获取更多资讯

java中枚举有什么用_java枚举原来还能这么用相关推荐

  1. java 枚举使用简书_Java枚举

    1.简介 java中,使用关键字enum来定义枚举类,枚举类是一个特殊的类,大部分功能和普通类是一样的,区别为: 枚举类继承了java.lang.Enum类,而不是默认的Object类.而java.l ...

  2. java枚举类型enum用法_Java枚举类型——Enum的简单用法

    枚举类型是Java1.5的新特性,是指由一组固定的常量组成合法的类型.Java中由关键字enum来定义一个枚举类型.我们可以使用枚举来取代用public final static修饰的一批相关数据.如 ...

  3. java 枚举使用简书_java枚举类型使用和详解

    1.定义 An enum type is a special data type that enables for a variable to be a set of predefined const ...

  4. java开关用法_如何在Java中使用带开关盒的枚举?

    Java中的枚举(枚举)是一种存储一组常量值的数据类型.您可以使用枚举来存储固定值,例如一周中的天,一年中的月等.enum Days { SUNDAY, MONDAY, TUESDAY, WEDNES ...

  5. java 枚举参数为对象_Java枚举值

    枚举类型定义了两件事: 枚举常量名称 常量的顺序 以下代码声明了一个名为Level的公共枚举类型,它具有四个枚举常量:LOW,MEDIUM,HIGH 和 URGENT. public enum Lev ...

  6. java枚举类型enum用法_java枚举类型enum用法和原理介绍【传智播客】

    Enum枚举类型 Enum的全写是Enumeration,这个词的翻译是列举.逐条陈述.细目.在程序语言中,枚举类型是一种特殊的数据类型(常用的数据类型比如字符串.整型),这种数据类型的变量值限定在固 ...

  7. 枚举类型enum用法_Java枚举深度解读,看这篇就够了

    作者 | 涛GuoGuo的跟屁虫丶博Ke 来源 | urlify.cn/aaamQf 66套java从入门到精通实战课程分享 Java枚举 1.枚举类概念的理解与定义 一个类的对象是有限个,确定的,我 ...

  8. java中为什么要用注解_java中的注解,真的很重要,你理解了嘛?

    这篇文章开始讲解java中的注解,在平时的开发当中我相信你或多或少的接触过注解.比如你可能都见过@override,它代表的就是一个注解.但是,为了更加清晰的去介绍注解,我还是先给出一个例子,让你能够 ...

  9. java中的关键字有哪些_java关键字复习

    java关键字复习 Java的主要工作是通过编程语言来制作互联网页面.制作动态效果以及网站等技术,以下是小编为大家搜索整理的java关键字复习, 希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕 ...

  10. java中Class是什么意思_java中class什么意思?

    class的意思为"类",是java中的一个类,是定义一个特定类的实现,存在于java.lang包中,它的构造函数是私有的,由JVM(类加载器)创建Class对象,可以通过getC ...

最新文章

  1. ​causal-learn:基于Python的因果发现算法平台
  2. 常用的数据分析图表及方法介绍
  3. 应用DOM操作文档的一个实用例子
  4. 归并排序,快速排序,冒泡排序,选择排序,基数排序,桶排序,堆排序(c++实现)
  5. java中线程的6种状态
  6. 数据库连接池的选择及其开发配置
  7. Linux 总线、设备、驱动模型的探究
  8. 安装用户debian7安装oracle11g
  9. 完美解决Mac电脑睡眠之后苹果电脑没有声音的方法
  10. mysql+php+模板+条目_PHP.MVC的模板标签系统(四)
  11. ArrayList源码阅读
  12. Linq 2 DataSet
  13. 2015年9月01日【磁盘和文件系统管理】-JY1506402-19+liuhui880818
  14. c语言程序设计 朱立华 下载,C语言程序设计 教学课件 朱立华 王立柱 C语言程序设计课件第1章090909.pdf...
  15. Ubuntu 系统文件同步工具 syncthing
  16. har后缀文件怎么提取?
  17. 机器学习种9种常用算法
  18. 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题 - 人工智能 - 电子发烧友网...
  19. 麻雀虽小五脏俱全--一个小项目的总结
  20. Android-蓝牙的网络共享与连接分析

热门文章

  1. 20191011每日一句
  2. c++拼接字符串效率比较(+=、append、stringstream、sprintf)
  3. windows下python调用C/C++以及使用C扩展python python通过pythonnet调用C# dll
  4. Atitit java ftp client sumup apache common net jar 1.1. 协议解析 1 1.2. 读取文件 1 2. } 3 1. 下载文件 ftpCli
  5. Atitit maven 编译与资源文件与web目录自定义配置 与eclipse的集成与war包打包 1.1. 配置webapp目录 plugin设置 webappDirectory 1 1.2.
  6. Atitit.每周末总结 于每周一计划日程表 流程表 v8 -------------import 上周遗漏日志补充 检查话费 检查流量情况 Crm问候 Crm表total and 问候
  7. Atitti 图像处理 图像混合 图像叠加 blend 原理与实现
  8. Atitit.nosql api 标准化 以及nosql数据库的实现模型分类差异
  9. Atitit.Gui控件and面板----web server区----- web服务器监控面板and控制台条目
  10. atitit.提升开发效率---使用服务器控件生命周期 asp.net 11个阶段 java jsf 的6个阶段比较