当前位置: 首页 > article >正文

枚举(Enum)不只是常量:打造带有业务逻辑的强类型状态机

枚举Enum不只是常量打造带有业务逻辑的强类型状态机在Java等编程语言中枚举Enum通常被视为简单的常量集合但实际上它们是功能强大的工具可以构建带有业务逻辑的强类型状态机。本文将展示如何通过给枚举类添加方法实现一个资金操作审批的状态流转系统体现枚举在业务逻辑中的强大能力。传统枚举的局限性传统上枚举被定义为简单的常量集合java1public enum ApprovalStatus { 2 PENDING, APPROVED, REJECTED, CANCELLED 3} 4这种用法虽然简单但缺乏行为表达能力状态之间的流转逻辑需要分散在多个服务类中实现导致代码难以维护和理解。枚举作为状态机的优势将枚举升级为状态机可以带来以下优势强类型安全编译器确保所有状态转换都是合法的自描述性状态转换逻辑直接关联到状态本身集中管理所有状态相关逻辑集中在一处可维护性新增状态或修改流转规则更方便实现资金操作审批状态机让我们实现一个资金操作审批的状态机包含以下状态和转换java1import java.math.BigDecimal; 2 3public enum ApprovalStatus { 4 // 待审批状态 5 PENDING { 6 Override 7 public ApprovalStatus approve(ApprovalContext context) { 8 if (context.getAmount().compareTo(BigDecimal.valueOf(10000)) 0) { 9 return NEED_MANAGER_APPROVAL; 10 } 11 return APPROVED; 12 } 13 14 Override 15 public ApprovalStatus reject(ApprovalContext context) { 16 return REJECTED; 17 } 18 }, 19 20 // 需要经理审批 21 NEED_MANAGER_APPROVAL { 22 Override 23 public ApprovalStatus approve(ApprovalContext context) { 24 // 经理审批逻辑 25 if (context.getManagerLevel() 2) { 26 return APPROVED; 27 } 28 return PENDING; // 降级需要重新审批 29 } 30 31 Override 32 public ApprovalStatus reject(ApprovalContext context) { 33 return REJECTED; 34 } 35 }, 36 37 // 已批准 38 APPROVED { 39 Override 40 public ApprovalStatus cancel(ApprovalContext context) { 41 if (context.getOperationDate().isBefore(context.getCurrentDate().minusDays(1))) { 42 return CANNOT_CANCEL; 43 } 44 return CANCELLED; 45 } 46 }, 47 48 // 已拒绝 49 REJECTED { 50 // 拒绝状态不可再审批或取消 51 }, 52 53 // 已取消 54 CANCELLED { 55 // 取消状态不可再操作 56 }, 57 58 // 不可取消状态 59 CANNOT_CANCEL { 60 // 不可操作状态 61 }; 62 63 // 状态转换方法 64 public ApprovalStatus approve(ApprovalContext context) { 65 throw new IllegalStateException(Cannot approve from state: this); 66 } 67 68 public ApprovalStatus reject(ApprovalContext context) { 69 throw new IllegalStateException(Cannot reject from state: this); 70 } 71 72 public ApprovalStatus cancel(ApprovalContext context) { 73 throw new IllegalStateException(Cannot cancel from state: this); 74 } 75 76 // 判断当前状态是否可以转换到目标状态 77 public boolean canTransitionTo(ApprovalStatus targetStatus) { 78 // 实现状态转换规则检查 79 // 这里可以添加更复杂的业务规则 80 switch (this) { 81 case PENDING: 82 return targetStatus APPROVED || targetStatus REJECTED || 83 targetStatus NEED_MANAGER_APPROVAL; 84 case NEED_MANAGER_APPROVAL: 85 return targetStatus APPROVED || targetStatus REJECTED || 86 targetStatus PENDING; 87 case APPROVED: 88 return targetStatus CANCELLED || targetStatus CANNOT_CANCEL; 89 default: 90 return false; 91 } 92 } 93} 94 95// 审批上下文类 96class ApprovalContext { 97 private BigDecimal amount; 98 private int managerLevel; 99 private LocalDate operationDate; 100 private LocalDate currentDate; 101 102 // 构造方法、getter和setter省略 103} 104使用状态机进行审批操作java1import java.math.BigDecimal; 2import java.time.LocalDate; 3 4public class ApprovalWorkflow { 5 public static void main(String[] args) { 6 ApprovalContext context new ApprovalContext(); 7 context.setAmount(new BigDecimal(15000)); 8 context.setManagerLevel(2); 9 context.setOperationDate(LocalDate.now()); 10 context.setCurrentDate(LocalDate.now()); 11 12 ApprovalStatus currentStatus ApprovalStatus.PENDING; 13 14 System.out.println(初始状态: currentStatus); 15 16 try { 17 // 尝试审批 18 currentStatus currentStatus.approve(context); 19 System.out.println(审批后状态: currentStatus); 20 21 // 检查是否可以取消 22 if (currentStatus.canTransitionTo(ApprovalStatus.CANCELLED)) { 23 currentStatus currentStatus.cancel(context); 24 System.out.println(取消后状态: currentStatus); 25 } 26 } catch (IllegalStateException e) { 27 System.out.println(状态转换失败: e.getMessage()); 28 } 29 } 30} 31高级实现技巧1. 使用策略模式处理复杂逻辑对于更复杂的业务规则可以在枚举方法中委托给策略对象java1public enum ApprovalStatus { 2 PENDING { 3 private final ApprovalStrategy strategy new LargeAmountApprovalStrategy(); 4 5 Override 6 public ApprovalStatus approve(ApprovalContext context) { 7 return strategy.handleApproval(this, context); 8 } 9 }, 10 // 其他状态... 11} 12 13interface ApprovalStrategy { 14 ApprovalStatus handleApproval(ApprovalStatus current, ApprovalContext context); 15} 16 17class LargeAmountApprovalStrategy implements ApprovalStrategy { 18 Override 19 public ApprovalStatus handleApproval(ApprovalStatus current, ApprovalContext context) { 20 if (context.getAmount().compareTo(BigDecimal.valueOf(10000)) 0) { 21 return ApprovalStatus.NEED_MANAGER_APPROVAL; 22 } 23 return ApprovalStatus.APPROVED; 24 } 25} 262. 添加状态转换历史记录java1public enum ApprovalStatus { 2 // ... 其他代码同上 3 4 public ListApprovalStatus getTransitionHistory() { 5 // 实现状态转换历史记录逻辑 6 // 可以通过上下文对象传递历史记录 7 return context.getTransitionHistory(); 8 } 9} 103. 使用枚举实现状态模式将每个状态实现为一个单独的类通过枚举统一管理java1public enum ApprovalStatus { 2 PENDING(new PendingState()), 3 APPROVED(new ApprovedState()), 4 // 其他状态... 5 ; 6 7 private final State state; 8 9 ApprovalStatus(State state) { 10 this.state state; 11 } 12 13 public ApprovalStatus approve(ApprovalContext context) { 14 return state.approve(context, this); 15 } 16 17 interface State { 18 ApprovalStatus approve(ApprovalContext context, ApprovalStatus current); 19 // 其他状态操作... 20 } 21 22 static class PendingState implements State { 23 Override 24 public ApprovalStatus approve(ApprovalContext context, ApprovalStatus current) { 25 // 实现待审批状态的审批逻辑 26 return ...; 27 } 28 } 29} 30实际应用中的考虑因素线程安全确保枚举方法是无状态的或线程安全的序列化枚举默认是可序列化的但要注意上下文对象的序列化测试为每个状态转换编写单元测试扩展性考虑使用工厂模式或策略模式处理复杂逻辑文档为每个状态和方法添加详细的JavaDoc结论通过为枚举添加方法我们可以创建强大的状态机将业务逻辑直接关联到状态本身。这种模式提供了更好的类型安全更集中的业务逻辑管理更清晰的代码结构更易于维护和扩展的系统在资金操作审批、订单处理、工作流管理等场景中这种模式能显著提高代码质量和可维护性。枚举远不止是简单的常量集合它们是构建健壮业务逻辑的强大工具。

相关文章:

枚举(Enum)不只是常量:打造带有业务逻辑的强类型状态机

枚举(Enum)不只是常量:打造带有业务逻辑的强类型状态机在Java等编程语言中,枚举(Enum)通常被视为简单的常量集合,但实际上它们是功能强大的工具,可以构建带有业务逻辑的强类型状态机…...

Orbitrap质谱20余年如1梦

摘要 本文综述了Orbitrap质谱作为主流高分辨准确质量(HR/AM) 技术问世的20年发展历程。文章梳理了Orbitrap分析器的研发历史、主流仪器系列的演进脉络,以及推动其广泛应用的关键技术创新;重点阐述混合与3合&#xff1…...

idea控制台如何实时grep搜索?

安装Grep Console 插件即可,运行时右键即可配合ctrl f 实现实时过滤,高亮显示 ;...

Locale Emulator:Windows多语言环境模拟的终极解决方案

Locale Emulator:Windows多语言环境模拟的终极解决方案 【免费下载链接】Locale-Emulator Yet Another System Region and Language Simulator 项目地址: https://gitcode.com/gh_mirrors/lo/Locale-Emulator 你是否曾因日文游戏显示乱码而烦恼?是…...

云原生入门系列|第20集:新手进阶提升,K8s新趋势+面试重点+实操提速

前言 各位云原生入门的小伙伴,欢迎来到《云原生入门系列》最后一集——第20集!上一集我们完成了全系列知识点复盘和综合实战演练,巩固了生产级运维核心能力,也明确了后续进阶方向。 作为系列收官之作,这一集我们不做重复复盘,也不讲解晦涩的新知识点,重点帮大家解决三…...

锐捷和H3C交换机STP配置命令对比:手把手教你开启并选对模式(STP/RSTP/MSTP)

锐捷与H3C交换机生成树协议配置全解析:从基础命令到模式选择实战 在现网环境中,生成树协议(STP)的配置是网络工程师的必修课。不同厂商的设备在STP实现上存在细微但关键的差异,这常常成为配置过程中的"暗礁"…...

【Java 25 FFI终极指南】:20年JVM专家亲授外部函数接口增强的5大生产级落地陷阱与避坑清单

更多请点击: https://intelliparadigm.com 第一章:Java 25 FFI增强的演进脉络与核心定位 Java 25 引入的 Foreign Function & Memory API(FFI)正式版标志着 JVM 与原生世界交互范式的根本性跃迁。它不再依赖 JNI 的脆弱桥接与…...

链开源免费的WPS AI 软件 察元AI文档助手:路 013:shouldUsePlainDocumentPipeline 与批注类动作分流

链路 013:shouldUsePlainDocumentPipeline 与批注类动作分流 总体链路图 下图在全系列各篇保持一致,仅通过高亮样式标示本篇所覆盖的环节;箭头表示主成功路径,点线为异常或可选路径。阅读任意一篇时都应能回到本图定位&#xff…...

3分钟解决B站缓存播放难题:m4s-converter无损转换完整指南

3分钟解决B站缓存播放难题:m4s-converter无损转换完整指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到过这样的困境…...

日常实用娱乐向|无需下载任何播放器!万能M3U8在线播放神器,追剧看直播永久备用

开篇前言 不管是电脑办公闲暇追剧,还是手机随身看各类直播源、高清影视资源,很多优质流媒体资源都是M3U8格式。但用过的朋友都知道,这种格式非常特殊,电脑自带播放器无法直接打开,手机普通视频软件也不支持解析。专门…...

前端八股文面经大全:字节抖音前端三面(2026-04-27)·面经深度解析

前言 大家好,我是木斯佳。 相信很多人都感受到了,在AI浪潮的席卷之下,前端领域的门槛在变高,纯粹的“增删改查”岗位正在肉眼可见地减少。曾经热闹非凡的面经分享,如今也沉寂了许多。但我们都知道,市场的…...

C++中继承的概念和定义

1.继承的概念及定义1.1继承的概念继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构&#xff0c…...

国风美学生成模型v1.0社区共建:如何参与开源项目并贡献Prompt案例

国风美学生成模型v1.0社区共建:从使用者到贡献者的实践指南 最近,国风美学生成模型v1.0在开发者圈子里热度挺高,很多朋友都在用它生成各种精美的国风图片。但你可能不知道,这个模型背后有一个非常活跃的开源社区。今天&#xff0…...

LFM2-2.6B-GGUF在运维自动化中的应用:智能解析日志并执行故障修复脚本

LFM2-2.6B-GGUF在运维自动化中的应用:智能解析日志并执行故障修复脚本 1. 运维自动化的新机遇 凌晨三点,服务器突然告警。运维工程师小王从睡梦中惊醒,手忙脚乱地登录系统查看日志,发现是数据库连接池耗尽导致的服务不可用。这种…...

Gems 捷迈 FT-110 工业级涡轮式低流量传感器的国产替代方案

Gems 捷迈 FT-110 系列流量传感器,是一款专为低流量液体监测打造的工业级涡轮式检测设备,凭借精准的测量性能、紧凑的结构设计与稳定的运行表现,广泛适配各类OEM应用场景,可高效完成液体瞬时流量与累积流量的精准采集,…...

nli-MiniLM2-L6-H768快速上手:7860端口Web界面交互式句子关系测试

nli-MiniLM2-L6-H768快速上手:7860端口Web界面交互式句子关系测试 1. 认识nli-MiniLM2-L6-H768服务 nli-MiniLM2-L6-H768是一个基于自然语言推理(Natural Language Inference)的智能服务,专门用于分析两个句子之间的逻辑关系。这个服务采用了cross-enc…...

springboot+vue3的BS架构勤工助学信息管理系统设计与实现

目录同行可拿货,招校园代理 ,本人源头供货商系统功能模块划分核心业务流程设计技术实现要点数据统计分析功能系统安全设计项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 系统功能模块划…...

别再为喇叭没声音发愁了!手把手教你用ES8311芯片搞定TTS云喇叭播放(附完整寄存器配置表)

ES8311音频芯片实战:从无声到完美播放的避坑指南 引言 当你终于完成了ES8311芯片的驱动移植,满怀期待地接上喇叭准备测试时——寂静。那种令人窒息的无声瞬间,相信每个嵌入式音频开发者都经历过。这不是简单的硬件故障,而是一场关…...

别再手动录入了!用ABAP BAPI批量创建SAP销售计划协议(VA31)的完整代码与避坑指南

ABAP自动化实战:用BAPI批量创建SAP销售计划协议的高效方案 每次看到业务部门同事在SAP GUI里重复录入上百条销售计划协议时,我都忍不住想——这简直是在浪费生命。作为ABAP开发者,我们完全有能力把这种机械劳动交给程序处理。本文将分享一套经…...

Qwen3-VL论文精读

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 这篇论文是Qwen3-VL的技术报告,详细介绍了通义千问团队最新、最强的视觉-语言模型(VLM)系列。下面我从…...

springboot+vue3宠物领养系统 原生微信小程序

目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析技术实现要点特色功能建议安全考虑项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 后端(SpringBoot&…...

Mac新手必看:保姆级Git+SourceTree配置指南,从SSH密钥到拉取代码一气呵成

Mac开发者入门:Git与SourceTree全流程配置实战手册 刚接触开发的Mac用户往往会在配置开发环境时遇到各种"小坑"。记得我第一次在Mac上配置Git和SourceTree时,花了整整一个下午才搞明白为什么SSH连接总是失败。本文将带你避开这些陷阱&#xf…...

Livox-ros-driver2安装后,如何快速验证你的HAP/Mid-360雷达数据流(ROS1/ROS2通用)

Livox-ros-driver2安装后快速验证HAP/Mid-360雷达数据流指南(ROS1/ROS2通用) 当你按照官方文档完成Livox-ros-driver2的安装后,最迫切的问题往往是:我的雷达真的工作了吗?数据流是否正常?本文将带你快速验证…...

线程安全 ≠ 协程安全:当全局缓存同时遇上线程池和 async,优秀 Python 工程师该如何设计?

线程安全 ≠ 协程安全:当全局缓存同时遇上线程池和 async,优秀 Python 工程师该如何设计? Python 让很多人第一次感受到编程的温柔:语法简洁,生态丰富,既能写 Web 服务,也能做数据分析、自动化脚…...

SYS_NC00002$之类的列

参考文档: https://askmaclean.com/archives/oracle-virtual-column.html System Generatedcolumn Names inDBA IND COLUMNS KB836884 IMPDP Fails With ORA-14148 When Moving Tables Between 10g And 12c Instances When Optimization Is In Use KB181188 R…...

Cursor Free VIP破解工具:三步解决AI编程助手试用限制的终极方案

Cursor Free VIP破解工具:三步解决AI编程助手试用限制的终极方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reache…...

英文论文降AI率好难啊,改了一晚上AI率还增加了16%,到底怎么降AI率啊?

英文论文降AI率比中文AI率还要难降。 最可怕的是,现在很多同学自己写的英文论文,用翻译软件翻译成中文,结果去检测还是有AI率! 为什么? 因为现在的很多翻译软件也开始AI化了! 任何产品都在搞AI&#xf…...

终极屏幕翻译神器:Translumo让你的Windows电脑瞬间打破语言壁垒

终极屏幕翻译神器:Translumo让你的Windows电脑瞬间打破语言壁垒 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/tr/Translumo …...

量子增强神经辐射场(QNeRF)技术解析与应用

1. 量子增强神经辐射场(QNeRF)技术解析 量子计算与神经辐射场的结合正在重塑计算机视觉领域的3D重建范式。传统NeRF通过多层感知机(MLP)建立3D坐标到颜色和密度的映射,其核心公式可表示为: F_θ : (x, d) → (c, σ) 其中θ代表网络参数,x∈…...

【AI Infra 核心】端到端 AI Infra 工程师的炼丹炉:从内核系统到上层框架的调优全景图

🚀【AI Infra 核心】端到端 AI Infra 工程师的炼丹炉:从内核系统到上层框架的调优全景图摘要:我们的连载已经来到了第 9 篇。前面我们手撕了显存池、无锁队列、PagedAttention 和量化算法,一直在“盲人摸象”式地深挖各个底层技术…...