java枚举原来还能这么用

前言

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

81c16edb01abf9a6905287d6d7c1465f.png

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

优化的办法固然可使用设计模式中的状态模式来搞,容许一个具备状态的对象根据其状态封装同一对象的不一样行为。咱们能够编程状态之间的转换,而后定义单独的状态:segmentfault

3a7712fe25ea715da4cce999f7e08372.png

可是这种操做会增长过多的状态对象依赖。那么有没骚操做呢?固然有。咱们先来了解了解状态机。设计模式

状态机

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

  • 状态 太废话了我,状态机没有状态还能叫状态机。
  • 事件 状态机的状态变动确定是经过触发一个事件引发的。
  • 行为 触发了以后执行的业务逻辑。好比说订单未支付状态到支付状态的变动须要走的业务,写流水、修改帐户余额等。
  • 变动 一个状态被一个事件触发执行了某些行为到达了另一个状态的过程。

1786d6c5729de8738d2eeb8bb3fbbe49.png
上图就是个变动的过程示意。接下来该说另外一个东西java枚举了。测试

Java中的枚举

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

96946720c5e689dcefa9c25dc0501491.png

咱们能够经过 Colorful.RED.colorName() 直接拿到颜色的名称,很是方便并且语义化。spa

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

实战操做

订单派送到收货这个场景,咱们考虑以下单纯的场景:设计

68f550216ebb615fe4a4d77b0d596054.png

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

91cfaad5231a51143a78e155d2c5c80c.png

由于调度是初始状态,因此其prevState方法指向本身,由于收货时终止状态因此其nextState指向本身。经过定义这两个指针来进行操做所须要的流程。固然实际生产要结合你本身的业务来作。

而后咱们订单流程就能够这样搞(省略getter和setter):

91cfaad5231a51143a78e155d2c5c80c.png

咱们来简单测试一下:

8da6c5308d0105cc45ad62a3f9e8d421.png

通过两次的流转,货物成功到达买家的手中,状态也正确的进行了变动,并且可维护性也获得了保证,只须要变动枚举流程。好了今天就到这里,但愿你们多多关注。

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

相关文章
相关标签/搜索