枚举类型应用场景

枚举类型的三大核心应用场景(附可运行代码)

在日常开发中,枚举(enum)不仅仅用来定义几个常量,它在状态管理策略模式以及统一返回码等场景下能极大提升代码的优雅度和可维护性。本文通过三个可直接运行的 Java 示例,带你掌握枚举的高级用法。


场景一:状态/类型定义(最常用!)

枚举最常见的用途是定义一组固定的常量,如订单状态、用户角色、任务类型等。相比使用整数或字符串,枚举能提供类型安全行为封装

示例:订单状态管理

// 文件名:OrderStatusDemo.java
public class OrderStatusDemo {
    // 订单状态枚举
    public enum OrderStatus {
        PENDING_PAYMENT(0, "待支付"),
        PAID(1, "已支付"),
        SHIPPED(2, "已发货"),
        DELIVERED(3, "已送达"),
        CANCELLED(4, "已取消");

        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 boolean isCancellable() {
            return this == PENDING_PAYMENT || this == PAID;
        }

        // 根据code获取枚举(模拟数据库存储转换)
        public static OrderStatus fromCode(int code) {
            for (OrderStatus status : values()) {
                if (status.code == code) {
                    return status;
                }
            }
            throw new IllegalArgumentException("无效的状态码: " + code);
        }
    }

    public static void main(String[] args) {
        OrderStatus status = OrderStatus.PAID;
        System.out.println("当前状态: " + status.getDescription());
        System.out.println("能否取消: " + status.isCancellable());
        System.out.println("状态码转为枚举: " + OrderStatus.fromCode(2));
        
        // 使用switch处理不同状态
        switch (status) {
            case PENDING_PAYMENT:
                System.out.println("请尽快完成支付");
                break;
            case PAID:
                System.out.println("等待商家发货");
                break;
            case SHIPPED:
                System.out.println("商品已发出,请注意查收");
                break;
            case DELIVERED:
                System.out.println("感谢您的购买");
                break;
            case CANCELLED:
                System.out.println("订单已取消");
                break;
        }
    }
}

运行输出

![屏幕截图 2026-06-10 092129](https://img2024.cnblogs.com/blog/3805930/202606/3805930-20260610092143658-1099172263.png)

---

## 场景二:策略模式(替换大量 if/else)

当遇到**根据不同类型执行不同算法**(如计算器、折扣策略、支付方式)时,枚举结合抽象方法能完美替代 `if-else` 或 `switch`,符合开闭原则。

### 示例:计算器(加减乘除)

```java
// 文件名:OperationStrategyDemo.java
public class OperationStrategyDemo {
    // 运算枚举(策略模式)
    public enum Operation {
        PLUS {
            @Override
            public double apply(double x, double y) { return x + y; }
        },
        MINUS {
            @Override
            public double apply(double x, double y) { return x - y; }
        },
        TIMES {
            @Override
            public double apply(double x, double y) { return x * y; }
        },
        DIVIDE {
            @Override
            public double apply(double x, double y) { 
                if (y == 0) throw new ArithmeticException("除数不能为0");
                return x / y; 
            }
        };

        // 抽象方法 —— 每个枚举常量自己实现策略逻辑
        public abstract double apply(double x, double y);
    }

    public static void main(String[] args) {
        double a = 10, b = 5;
        
        // 传统 if-else 方式(大量冗余)
        // if (op.equals("PLUS")) result = a+b; else if (op.equals("MINUS"))...
        
        // 优雅的枚举策略方式
        for (Operation op : Operation.values()) {
            System.out.printf("%.0f %s %.0f = %.2f%n", 
                a, op.name(), b, op.apply(a, b));
        }
        
        // 动态选择策略(例如根据用户输入)
        String inputOp = "TIMES";
        Operation selected = Operation.valueOf(inputOp);
        System.out.printf("%.0f %s %.0f = %.2f%n", 
            a, selected.name(), b, selected.apply(a, b));
    }
}

运行输出


![屏幕截图 2026-06-10 092603](https://img2024.cnblogs.com/blog/3805930/202606/3805930-20260610092617061-860149639.png)

优势:新增运算(如取余、幂运算)只需增加一个枚举常量,无需修改已有代码,完全符合策略模式。


场景三:统一返回码(后端接口必备)

在 Web 开发中,接口统一返回码和消息是规范的基础。枚举可以集中管理所有业务返回码,避免魔法数字和散落各处的错误消息。

示例:通用结果封装

// 文件名:ResultCodeDemo.java
import java.util.HashMap;
import java.util.Map;

public class ResultCodeDemo {
    // 统一返回码枚举
    public enum ResultCode {
        SUCCESS(200, "操作成功"),
        BAD_REQUEST(400, "请求参数有误"),
        UNAUTHORIZED(401, "未授权,请重新登录"),
        FORBIDDEN(403, "无权限访问"),
        NOT_FOUND(404, "资源不存在"),
        SERVER_ERROR(500, "服务器内部错误");

        private final int code;
        private final String message;

        ResultCode(int code, String message) {
            this.code = code;
            this.message = message;
        }

        public int getCode() { return code; }
        public String getMessage() { return message; }
    }

    // 统一响应类(仿照真实接口中的Result)
    public static class ApiResult<T> {
        private int code;
        private String message;
        private T data;

        public ApiResult(ResultCode resultCode, T data) {
            this.code = resultCode.getCode();
            this.message = resultCode.getMessage();
            this.data = data;
        }

        public ApiResult(ResultCode resultCode) {
            this(resultCode, null);
        }

        // 成功快捷方法
        public static <T> ApiResult<T> success(T data) {
            return new ApiResult<>(ResultCode.SUCCESS, data);
        }

        public static ApiResult<?> error(ResultCode resultCode) {
            return new ApiResult<>(resultCode);
        }

        @Override
        public String toString() {
            return String.format("{code:%d, message:\"%s\", data:%s}", 
                code, message, data);
        }
    }

    public static void main(String[] args) {
        // 模拟接口返回
        System.out.println("登录成功: " + ApiResult.success("用户Token"));
        System.out.println("参数错误: " + ApiResult.error(ResultCode.BAD_REQUEST));
        System.out.println("服务器异常: " + ApiResult.error(ResultCode.SERVER_ERROR));

        // 使用枚举值,避免硬编码
        if (someBusinessCheck()) {
            System.out.println(new ApiResult<>(ResultCode.SUCCESS));
        } else {
            System.out.println(new ApiResult<>(ResultCode.FORBIDDEN));
        }
    }

    private static boolean someBusinessCheck() {
        return false; // 模拟业务校验失败
    }
}

运行输出

屏幕截图 2026-06-10 093052


**在实际后端(Spring Boot等)** 中,可直接将 `ResultCode` 注入响应,确保整个项目返回码规整一致。

---
posted @ 2026-06-10 09:33  jenini  阅读(0)  评论(0)    收藏  举报