程序员scholar 程序员scholar
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
首页
  • Java 基础

    • JavaSE
    • JavaIO
    • JavaAPI速查
  • Java 高级

    • JUC
    • JVM
    • Java新特性
    • 设计模式
  • Web 开发

    • Servlet
    • Java网络编程
  • Web 标准

    • HTML
    • CSS
    • JavaScript
  • 前端框架

    • Vue2
    • Vue3
    • Vue3 + TS
    • 微信小程序
    • uni-app
  • 工具与库

    • jQuery
    • Ajax
    • Axios
    • Webpack
    • Vuex
    • WebSocket
    • 第三方登录
  • 后端与语言扩展

    • ES6
    • Typescript
    • node.js
  • Element-UI
  • Apache ECharts
  • 数据结构
  • HTTP协议
  • HTTPS协议
  • 计算机网络
  • Linux常用命令
  • Windows常用命令
  • SQL数据库

    • MySQL
    • MySQL速查
  • NoSQL数据库

    • Redis
    • ElasticSearch
  • 数据库

    • MyBatis
    • MyBatis-Plus
  • 消息中间件

    • RabbitMQ
  • 服务器

    • Nginx
  • Spring框架

    • Spring6
    • SpringMVC
    • SpringBoot
    • SpringSecurity
  • SpringCould微服务

    • SpringCloud基础
    • 微服务之DDD架构思想
  • 日常必备

    • 开发常用工具包
    • Hutoll工具包
    • IDEA常用配置
    • 开发笔记
    • 日常记录
    • 项目部署
    • 网站导航
    • 产品学习
    • 英语学习
  • 代码管理

    • Maven
    • Git教程
    • Git小乌龟教程
  • 运维工具

    • Docker
    • Jenkins
    • Kubernetes
  • 算法笔记

    • 算法思想
    • 刷题笔记
  • 面试问题常见

    • 十大经典排序算法
    • 面试常见问题集锦
关于
GitHub (opens new window)
npm

(进入注册为作者充电)

  • 后端开发

    • Spring Boot多模块项目开发
    • Spring Boot图片资源返回
    • Spring Boot文件上传
    • Spring Boot文件下载
    • 对接第三方文件上传
    • Servlet 原生API
    • HttpServletResponse 和 ResponseEntity
    • 后端解决跨域问题
    • 后端拦截器
    • SpringBoot+Vue实现邮件发送与验证码验证
    • 谷歌验证码
    • 利用hutool工具类实现图片验证码
    • 统一返回格式
    • 通用 普通 登录模块
    • 通用 JWT 登录认证模块
    • 通用 普通 注册模块
    • 基于 MyBatis curd
    • 基于 MyBatis-Plus curd
    • Java 常见对象模型
    • 开发枚举的使用
      • 1. 直接通过枚举类名访问常量
      • 2. 给枚举常量添加参数
      • 3. 根据 `code` 获取枚举常量
      • 4. 根据枚举常量执行对应的业务逻辑
      • 5. 与数据库或前端交互:更新订单状态
      • 6. 返回处理结果给前端:返回订单状态描述
      • 7. 结合策略模式:为每个枚举常量定义特定的行为
      • 8. 枚举类总结
    • MyBatis与MyBatis-Plus日期类型处理
    • 接口日志拦截基础版
    • 接口日志拦截进阶版
    • 文件操作工具类
    • Spring Boot 数据校验
    • 幂等性
  • 前端开发

  • 开发笔记
  • 后端开发
scholar
2024-12-27
目录

开发枚举的使用

# 开发枚举的使用

在 Java 开发中,枚举(Enum)是一种用于表示固定常量集合的特殊类。枚举不仅仅用于表示常量,还可以携带参数、定义方法、实现接口等,从而在处理状态、类型、操作等场景时显得非常强大。


# 1. 直接通过枚举类名访问常量

原因:在一些简单的场景中,我们只需要用枚举来表示一组固定的常量。这种方式避免了使用字符串或整数常量时可能出现的错误,提高了代码的可读性和安全性。通过枚举类名直接访问常量,是最简单且常用的方式。

/**
 * 定义一个基本的枚举类,用于表示颜色
 * 该枚举类仅包含常量 RED, GREEN, BLUE,适用于简单的场景
 */
public enum Color {
    RED,   // 红色
    GREEN, // 绿色
    BLUE   // 蓝色
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        // 直接通过枚举类名访问枚举常量
        Color color = Color.RED;
        System.out.println(color);  // 输出: RED

        // 获取枚举常量的名称和序数
        System.out.println("Name: " + color.name());     // 输出: Name: RED
        System.out.println("Ordinal: " + color.ordinal()); // 输出: Ordinal: 0

        // 遍历所有枚举常量
        for (Color c : Color.values()) {
            System.out.println(c);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

关键点说明:

  • Enum.values(): 每个枚举类都自动提供了 values() 方法,返回一个包含所有枚举常量的数组。它常用于遍历所有枚举常量。
  • Enum.name(): 返回枚举常量的名称,作为字符串。
  • Enum.ordinal(): 返回枚举常量的序数,从 0 开始。

应用场景:

  • 适用于表示固定集合的常量,如颜色、方向、货币符号等。
  • 提高代码可读性,避免使用魔法值(magic number)。

# 2. 给枚举常量添加参数

原因:当枚举常量不仅仅需要表示一个名称,还需要携带额外的信息(例如描述、状态码等)时,我们可以通过在枚举类中定义属性,并在构造方法中为这些属性赋值。通过 getter 方法可以方便地访问这些参数,这在复杂的业务场景中尤为重要。

/**
 * 带有参数的枚举类,用于表示HTTP状态码
 * 每个枚举常量都有一个状态码和对应的描述信息
 */
public enum HttpStatus {
    OK(200, "OK"),                // 成功
    NOT_FOUND(404, "Not Found"),  // 资源未找到
    INTERNAL_ERROR(500, "Internal Server Error");  // 服务器内部错误

    private final int code;           // HTTP状态码
    private final String description; // 状态码描述

    // 构造方法,用于初始化枚举常量的属性
    HttpStatus(int code, String description) {
        this.code = code;
        this.description = description;
    }

    // 获取状态码
    public int getCode() {
        return code;
    }

    // 获取描述信息
    public String getDescription() {
        return description;
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        // 访问枚举常量并获取其参数
        HttpStatus status = HttpStatus.NOT_FOUND;
        System.out.println("Code: " + status.getCode());           // 输出: Code: 404
        System.out.println("Description: " + status.getDescription()); // 输出: Description: Not Found
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

关键点说明:

  • 构造方法:枚举类可以有构造方法,用于在枚举常量被创建时初始化其属性。构造方法只能为 private 或默认(包访问权限)。
  • getter 方法:通过为枚举类定义 getter 方法,可以获取枚举常量的属性值,如 getCode()、getDescription()。
  • 不可变性:枚举常量的属性通常是 final,确保枚举常量一旦创建,其属性不会改变。

应用场景:

  • 表示复杂的业务常量,如 HTTP 状态码、订单状态、用户角色等。
  • 枚举常量需要携带附加信息(如描述、状态码),以便在应用程序中灵活使用。

# 3. 根据 code 获取枚举常量

原因:在实际开发中,很多时候枚举值会以整数或字符串的形式存储在数据库中,或者从外部系统传入。为了将这些 code 转换为对应的枚举常量,我们可以定义一个静态方法(例如 getByCode),通过传入的 code 返回对应的枚举常量。这样可以确保代码的健壮性和可维护性。

/**
 * 定义订单状态的枚举类,包含状态码和描述
 * 通过静态方法可以根据状态码获取对应的枚举常量
 */
public enum OrderStatus {
    PENDING(1, "等待处理"),
    SHIPPED(2, "已发货"),
    DELIVERED(3, "已送达");

    private final int code;           // 状态码
    private final String description; // 状态描述

    // 构造方法,用于初始化枚举常量的属性
    OrderStatus(int code, String description) {
        this.code = code;
        this.description = description;
    }

    // 获取状态码
    public int getCode() {
        return code;
    }

    // 获取描述信息
    public String getDescription() {
        return description;
    }

    // 根据状态码获取对应的枚举常量
    public static OrderStatus getByCode(int code) {
        // 遍历所有的枚举常量,查找匹配的状态码
        for (OrderStatus status : OrderStatus.values()) {
            if (status.getCode() == code) {
                return status;  // 返回匹配的枚举常量
            }
        }
        // 如果没有找到匹配的状态码,抛出异常
        throw new IllegalArgumentException("无效的状态码: " + code);
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        // 根据code获取对应的枚举常量
        OrderStatus status = OrderStatus.getByCode(2);
        System.out.println(status);  // 输出: SHIPPED
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

关键点说明:

  • static 方法:通过定义 static 方法(如 getByCode),可以从外部输入值中获取对应的枚举常量。
  • IllegalArgumentException:当输入的 code 无效时,抛出 IllegalArgumentException 异常,避免程序出错。

应用场景:

  • 当枚举常量存储在数据库中,并以 code 形式与外部系统交互时。
  • 处理来自前端或其他系统的状态码,将其转换为枚举类型,便于业务逻辑处理。

# 4. 根据枚举常量执行对应的业务逻辑

原因:在业务处理中,不同的枚举常量往往对应不同的业务逻辑。例如,订单状态可能需要执行不同的处理操作。通过枚举类,我们可以避免在代码中使用大量的 if-else 或 switch 语句,而是通过枚举常量直接调用对应的业务逻辑方法,从而使代码更加清晰和易于维护。

/**
 * 订单服务类,用于处理不同订单状态下的业务逻辑
 */
public class OrderService {

    /**
     * 根据订单状态码处理订单
     * @param code 订单状态码
     */
    public void processOrder(int code) {
        // 根据状态码转换为对应的枚举类型
        OrderStatus status = OrderStatus.getByCode(code);

        // 根据枚举类型执行对应的业务逻辑
        switch (status) {
            case

 PENDING:
                handlePendingOrder();  // 处理待处理的订单
                break;
            case SHIPPED:
                handleShippedOrder();  // 处理已发货的订单
                break;
            case DELIVERED:
                handleDeliveredOrder();  // 处理已送达的订单
                break;
            default:
                // 处理无法识别的状态(正常情况下不会发生)
                throw new IllegalArgumentException("无法处理的订单状态: " + status);
        }
    }

    // 处理待处理订单的逻辑
    private void handlePendingOrder() {
        System.out.println("处理待处理订单...");
        // 具体处理逻辑
    }

    // 处理已发货订单的逻辑
    private void handleShippedOrder() {
        System.out.println("处理已发货订单...");
        // 具体处理逻辑
    }

    // 处理已送达订单的逻辑
    private void handleDeliveredOrder() {
        System.out.println("处理已送达订单...");
        // 具体处理逻辑
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        OrderService orderService = new OrderService();
        // 假设订单状态码是2,表示已发货
        orderService.processOrder(2);  // 输出: 处理已发货订单...
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

关键点说明:

  • switch 语句:在处理不同枚举常量时,可以使用 switch 语句,根据不同的枚举常量执行不同的逻辑。
  • 方法定义在枚举内部:可以在枚举类内部定义具体的方法,每个枚举常量调用该方法时,执行对应的业务逻辑。

应用场景:

  • 根据订单状态、用户角色等执行不同的业务逻辑。
  • 在应用程序中通过枚举常量的不同值,调用不同的处理逻辑。

# 5. 与数据库或前端交互:更新订单状态

原因:在实际开发中,订单状态等信息通常会存储在数据库中,或者需要通过前端与后端进行交互。使用枚举类的 code 或 description 属性,可以确保数据库或前端的状态与后端代码中的逻辑保持一致。这样可以避免数据不一致的问题,并且简化了数据的处理流程。

/**
 * 订单仓储类,用于与数据库交互,更新订单状态
 */
public class OrderRepository {

    /**
     * 根据订单ID更新订单的状态
     * @param orderId 订单ID
     * @param status 订单的状态枚举
     */
    public void updateOrderStatus(int orderId, OrderStatus status) {
        // 构建更新订单状态的SQL语句
        String sql = "UPDATE orders SET status_code = ? WHERE id = ?";
        
        // 执行数据库操作(伪代码)
        // 假设有一个database对象可以执行SQL语句
        // database.execute(sql, status.getCode(), orderId);
        
        // 输出模拟的操作结果
        System.out.println("订单 " + orderId + " 更新为状态: " + status.getDescription());
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        OrderRepository repository = new OrderRepository();
        // 假设我们要更新ID为12345的订单状态为已送达
        repository.updateOrderStatus(12345, OrderStatus.DELIVERED);  // 输出: 订单 12345 更新为状态: 已送达
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

关键点说明:

  • 数据库操作:使用枚举的 code 属性作为数据库中对应字段的值,确保数据的类型安全和一致性。
  • 与前端交互:将枚举常量的 description 或 code 传递给前端,确保前后端数据的一致性。

应用场景:

  • 更新数据库中的订单状态、用户角色等数据。
  • 与前端系统进行交互,返回状态码或描述信息。

# 6. 返回处理结果给前端:返回订单状态描述

原因:在处理完业务逻辑后,通常需要将处理结果返回给前端。通过枚举类,可以方便地返回对应的描述信息或其他属性,确保前后端数据的一致性和可读性。这在实际开发中是非常常见的场景,尤其是在响应前端请求时。

/**
 * 订单控制器类,用于处理前端请求并返回处理结果
 */
public class OrderController {

    /**
     * 处理订单状态的请求,并返回处理后的状态描述
     * @param code 订单状态码
     * @return 处理后的订单状态描述
     */
    public String handleOrder(int code) {
        // 根据状态码转换为对应的枚举类型
        OrderStatus status = OrderStatus.getByCode(code);

        // 执行业务逻辑(这里简化为直接返回状态描述)
        return "订单处理结果: " + status.getDescription();
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        OrderController controller = new OrderController();
        // 假设传入的订单状态码是3,表示已送达
        String result = controller.handleOrder(3);
        System.out.println(result);  // 输出: 订单处理结果: 已送达
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

关键点说明:

  • 返回描述信息:通过枚举的 description 属性,返回友好的描述信息给前端。
  • 前后端一致性:使用枚举类的固定常量,确保前端和后端的状态码和描述信息一致。

应用场景:

  • 返回处理结果给前端,如订单状态、操作结果等。
  • 确保前后端的数据一致性,避免数据不一致带来的问题。

# 7. 结合策略模式:为每个枚举常量定义特定的行为

原因:在复杂的业务场景中,不同的枚举常量可能需要执行不同的策略。通过策略模式,可以将行为逻辑直接定义在枚举常量中,这使得代码结构更加清晰和易于扩展。在实际开发中,这种方法非常适用于具有多种处理逻辑的场景,如支付方式、订单状态等。

/**
 * 订单策略接口,定义订单处理的行为
 */
public interface OrderStrategy {
    void execute();  // 定义处理订单的抽象方法
}

/**
 * 订单状态枚举,实现订单策略接口
 * 每个枚举常量定义了具体的处理逻辑
 */
public enum OrderStatus implements OrderStrategy {
    PENDING {
        @Override
        public void execute() {
            System.out.println("处理待处理订单...");
            // 具体处理逻辑
        }
    },
    SHIPPED {
        @Override
        public void execute() {
            System.out.println("处理已发货订单...");
            // 具体处理逻辑
        }
    },
    DELIVERED {
        @Override
        public void execute() {
            System.out.println("处理已送达订单...");
            // 具体处理逻辑
        }
    };
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        // 假设订单状态码是1,表示待处理
        OrderStatus status = OrderStatus.getByCode(1);
        // 调用对应的处理逻辑
        status.execute();  // 输出: 处理待处理订单...
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

关键点说明:

  • 策略模式:为每个枚举常量定义具体的行为逻辑,使得每个枚举常量具备特定的功能。
  • 接口实现:通过让枚举实现特定接口,每个枚举常量都可以定义自己的实现逻辑。

应用场景:

  • 实现不同订单状态、支付方式的处理逻辑。
  • 在复杂业务场景中,根据不同的枚举常量执行不同的业务策略。

# 8. 枚举类总结

在实际开发中,合理使用枚举类可以极大地提高代码的可读性、维护性和扩展性。

  1. 直接通过枚举类名访问常量:适用于表示固定集合的常量,如颜色、方向、货币符号等,通过 name() 和 ordinal() 获取枚举常量的名称和序数。
  2. 给枚举常量添加参数:在复杂业务场景中,枚举常量需要携带额外的信息(如描述、状态码),通过构造方法初始化,并通过 getter 方法访问。
  3. 根据 code 获取枚举常量:用于将数据库或外部系统传入的 code 转换为枚举常量,确保数据一致性,防止无效输入。
  4. 根据枚举常量执行对应的业务逻辑:通过 switch 语句或在枚举内部定义方法,根据枚举常量执行不同的业务逻辑,简化代码结构。
  5. 与数据库或前端交互:更新订单状态:使用枚举的 code 或 description 属性更新数据库或与前端系统交互,确保数据一致性。
  6. 返回处理结果给前端:返回订单状态描述:通过枚举类返回处理结果,确保前后端数据的一致性和可读性。
  7. 结合策略模式:为每个枚举常量定义特定的行为:通过策略模式,在复杂业务场景中,根据不同的枚举常量执行不同的业务策略,使代码更加清晰和易于扩展。
编辑此页 (opens new window)
上次更新: 2025/03/16, 22:19:39
Java 常见对象模型
MyBatis与MyBatis-Plus日期类型处理

← Java 常见对象模型 MyBatis与MyBatis-Plus日期类型处理→

Theme by Vdoing | Copyright © 2019-2025 程序员scholar
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式