讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中如何使用枚举类型实现状态机_枚举状态机操作指南

雨丽大大_5494

雨丽大大_5494

发布时间:2025-11-15 08:30:06

|

772人浏览过

|

来源于php中文网

原创

枚举实现状态机因类型安全、封装性强、易扩展和高可读性,适合管理有限状态流转。以订单为例,定义OrderState枚举,每个状态重写next(String event)方法,根据事件返回下一状态,非法转移抛异常。Order类持当前状态,通过fireEvent触发转移并更新状态。还可扩展onEnter/onExit钩子,在状态切换时执行动作,如日志或通知,提升实用性。核心是将状态与行为封装于枚举,使流转清晰可控,代码更易维护。

在java中如何使用枚举类型实现状态机_枚举状态机操作指南

在Java中,枚举类型不仅是定义常量的工具,还能通过其方法和状态封装能力实现轻量级的状态机。利用枚举实现状态机,可以让代码更清晰、可维护性更强,特别适合管理有限且明确的状态流转场景,比如订单状态、工作流控制或设备运行模式。

为什么用枚举实现状态机

枚举天然适合表示一组固定的状态。每个枚举值可以携带行为(方法)和数据(字段),这意味着你可以将状态和状态转移逻辑封装在枚举内部,避免使用大量if-else或switch-case判断。

优势包括:

  • 类型安全:编译期检查状态合法性
  • 封装性强:状态转移逻辑集中在一处
  • 易于扩展:新增状态只需修改枚举
  • 可读性高:状态流转清晰直观

定义状态枚举并封装转移逻辑

以订单系统为例,订单有“待支付”、“已支付”、“已发货”、“已完成”等状态。我们可以定义一个枚举,每个状态都提供合法的下一个状态及转移方法。

立即学习“Java免费学习笔记(深入)”;

public enum OrderState {
    PENDING {
        public OrderState next(String event) {
            if ("PAY".equals(event)) return PAID;
            throw new IllegalStateException("Invalid transition");
        }
    },
    PAID {
        public OrderState next(String event) {
            if ("SHIP".equals(event)) return SHIPPED;
            throw new IllegalStateException("Invalid transition");
        }
    },
    SHIPPED {
        public OrderState next(String event) {
            if ("COMPLETE".equals(event)) return COMPLETED;
            throw new IllegalStateException("Invalid transition");
        }
    },
    COMPLETED {
        public OrderState next(String event) {
            throw new IllegalStateException("No further transitions allowed");
        }
    };

    public abstract OrderState next(String event);
}

每个枚举实例重写next()方法,根据输入事件返回下一个状态。非法转移会抛出异常,防止状态错乱。

Java Api Extractor
Java Api Extractor

从 Java 项目中提取 Controller 层接口定义为 JSON 数据。

下载

在业务类中使用枚举状态机

创建一个订单类,持有当前状态,并通过事件触发状态转移。

public class Order {
    private OrderState state;

    public Order() {
        this.state = OrderState.PENDING;
    }

    public void fireEvent(String event) {
        OrderState nextState = state.next(event);
        this.state = nextState;
        System.out.println("State changed to: " + state);
    }

    public OrderState getState() {
        return state;
    }
}

使用示例:

Order order = new Order();
order.fireEvent("PAY");     // 输出:State changed to: PAID
order.fireEvent("SHIP");    // 输出:State changed to: SHIPPED
order.fireEvent("COMPLETE");// 输出:State changed to: COMPLETED

如果传入非法事件,如在PENDING状态下调用"SHIP",会抛出异常,阻止非法操作。

增强状态机:添加进入/退出动作

实际项目中,状态转移可能需要执行某些动作,比如发送通知、记录日志。可以在枚举中加入钩子方法。

public enum OrderState {
    PENDING {
        public void onEnter() { System.out.println("等待用户付款..."); }
        public OrderState next(String event) {
            if ("PAY".equals(event)) {
                onExit();
                return PAID;
            }
            throw new IllegalStateException("...");
        }
    },
    PAID {
        public void onEnter() { System.out.println("已付款,准备发货..."); }
        public OrderState next(String event) {
            if ("SHIP".equals(event)) {
                onExit();
                return SHIPPED;
            }
            throw new IllegalStateException("...");
        }
    };

    public void onEnter() {}
    public void onExit() {}
    public abstract OrderState next(String event);
}

这样,在状态转移前后可以自动执行特定逻辑,提升状态机的实用性。

基本上就这些。用枚举实现状态机不复杂但容易忽略细节,关键是把状态和行为一起封装,让流转可控、可查、可维护。

热门AI工具

更多
Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

超级麦吉

一款通过数字员工协作完成调研、数据分析与文档制作的AI办公平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6899

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6224

2023.10.24

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

1071

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

1437

2024.03.13

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

60

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

40

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

120

2026.10.28

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

140

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

120

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn