前言

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

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

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

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

状态机

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

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

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

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

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

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

Java中的枚举

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

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

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

实战操作

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

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

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

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

我们来简单测试一下:

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

作者:码农小胖哥

来源:https://segmentfault.com/a/1190000020216365

java枚举很少被使用_java中枚举原来还可以这么用相关推荐

  1. java是如何实现原语的_Java中的低GC:使用原语而不是包装器

    java是如何实现原语的 总览 有两个很好的理由在可能的地方使用原语而不是包装器. 明晰. 通过使用原语,您可以清楚地知道null值是不合适的. 性能. 使用原语通常更快. 清晰度通常比性能更重要,并 ...

  2. java 调用枚举种方法_Java中枚举类型的一种使用方式

    今天改同事的代码发现同事的代码中有大量的if else语句.很不美观而且可读性太差. 因为需要给前端一个key,value的列表.这个列表写死.然而同事的代码. 放几张图,大家自己感受.我都不知道以后 ...

  3. java定义枚举并赋值_java中枚举的特性是什么?如何赋值?

    上次已经为大家介绍过java枚举的概念是什么的主要内容了.今天再来为大家介绍一些相关的知识,也是关于java枚举的一些内容,也就是它的特性以及如何赋值,一起来了解一下吧. 首先说一下,java中枚举的 ...

  4. java中 enum什么意思_Java中枚举Enum的使用详解

    在某些情况下,一个类的对象时有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类: 在 Java 中使用 enum 关键字来定义枚举类,其地位与 clas ...

  5. java 枚举的继承_java中枚举类可以被继承吗?

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

  6. java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国

    学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin 当 Java SE 8(又名核心 Java 8)在 2014 年被推出时,它引入了一些更改,从根本上影响了用 ...

  7. java 怎么把list流化_Java 中的数据流和函数式编程

    原标题:Java 中的数据流和函数式编程 学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin(作者) 当 Java SE 8(又名核心 Java 8)在 201 ...

  8. java编写代码时易出错_JAVA中易出错的小问题(一)

    ----------- android培训.java培训.java学习型技术博客.期待与您交流! ------------ 第一:奇数性 static boolean isodd(int i){ re ...

  9. java的自增自减_Java中自增和自减操作符(++/--)的那些事

    自增(++)和自减(--)运算符 在JAVA语言中存在着很多运算符,但是在实际开发中我们或许很少用到它们,在初次学习中却时常出现它们的身影,对于这些运算符的含义和用法,是否还记得呢? 1. 概述 自增 ...

最新文章

  1. Android开发 ----------怎样真机调试?
  2. webpack Entrypoint undefined = index.html
  3. jmeter分布式压测原理简介1
  4. 清华大学人工智能研究院知识中心成立仪式隆重举行,发布知识计算开放平台...
  5. 一起谈.NET技术,用NuGet掌管你的Visual Studio扩展
  6. java DTO循环_Java Stream与for循环比较
  7. 九宫怎么排列和使用_开心数独:好友都在玩的数独九宫格小游戏,居家无聊杀时间必备!...
  8. 实训四 思科交换机端口聚合提供冗余链路
  9. QTableView遍历
  10. 【无人机】【2017.10】无人机(UAV)在地学野外工作中建立增强型虚拟野外指南(EVFG)的作用研究
  11. 计算机教师成绩分析总结与反思,2017教师期中考试总结反思
  12. 2、如何搭建百度离线地图服务
  13. 时空人工智能概念特点和核心能力
  14. Bitwise Operation
  15. 解决import org.junit.Test 和@Test报错
  16. 微信小程序05---聊天室的搭建
  17. Linux中延时/暂停函数(sleep/usleep/nanosleep/select)的比较、底层实现说明
  18. 优衣库46万客户信息遭泄露,这些年,你的信息还被谁泄露过?
  19. DTX1800校准的意义?---DTX-1800线缆测试仪此校准而非彼校准
  20. 多测师肖sir_高级金牌讲师_app测试之环境安装(001)

热门文章

  1. @广州开发者,华为送来一份说明书——助你轻松应对开发难题
  2. 任正非要“拿钱砸人”的芯片产业:平均薪资 10424 元,人才缺口超 30 万!
  3. 突发!Java首度“落泪”,愿永久祝福Python!网友:我也想哭!
  4. 26岁辞职、365天创业,就让程序员任性一回
  5. 流浪汉转型程序员,年薪超 70 万人民币!
  6. 华硕win10键盘失灵_Win10 进阶用法汇总
  7. mysql操作数据库的步骤,Golang操作MySql数据库的完整步骤记录
  8. san分布式共享文件系统_【最强科普】一文读懂分布式存储
  9. 实现树状图_举个栗子!Tableau 技巧(132):用参数操作实现数据下钻
  10. php查询mysql表的行数据类型,PHP 使用mysql_fetch_row 查询获得数据行列表的简单示例...