笔记日期:2026.4.26

Java 枚举类型应用场景笔记

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

核心作用

替代传统的 public static final 常量,将一组固定的状态/类型集中管理,自带类型校验,避免魔法值和非法值传入。

示例:订单状态枚举

public enum OrderStatusEnum {
    // 枚举实例:状态名称 + 状态码 + 描述
    UNPAID(0, "未支付"),
    PAID(1, "已支付"),
    SHIPPED(2, "已发货"),
    COMPLETED(3, "已完成"),
    CANCELLED(4, "已取消");

    private final Integer code;
    private final String desc;

    // 私有构造方法(枚举的构造方法默认私有)
    OrderStatusEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    // 根据状态码获取枚举实例
    public static OrderStatusEnum getByCode(Integer code) {
        for (OrderStatusEnum status : OrderStatusEnum.values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException("无效的订单状态码:" + code);
    }

    // Getter
    public Integer getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }
}
        

优势

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

核心作用

将不同分支的业务逻辑封装到枚举中,用枚举实例直接执行对应逻辑,彻底消除冗长的分支判断。

示例:支付方式策略枚举

public enum PayStrategyEnum {
    ALIPAY("alipay") {
        @Override
        public void pay(BigDecimal amount) {
            System.out.println("调用支付宝支付接口,金额:" + amount);
        }
    },
    WECHAT_PAY("wechat") {
        @Override
        public void pay(BigDecimal amount) {
            System.out.println("调用微信支付接口,金额:" + amount);
        }
    },
    UNION_PAY("union") {
        @Override
        public void pay(BigDecimal amount) {
            System.out.println("调用银联支付接口,金额:" + amount);
        }
    };

    private final String type;

    // 定义抽象方法,由每个枚举实例实现
    public abstract void pay(BigDecimal amount);

    PayStrategyEnum(String type) {
        this.type = type;
    }

    public static PayStrategyEnum getByType(String type) {
        for (PayStrategyEnum strategy : PayStrategyEnum.values()) {
            if (strategy.type.equals(type)) {
                return strategy;
            }
        }
        throw new IllegalArgumentException("不支持的支付方式:" + type);
    }

    public String getType() {
        return type;
    }
}
        

使用方式(无分支逻辑)

public class PayService {
    public void doPay(String payType, BigDecimal amount) {
        // 直接通过枚举获取对应策略并执行,无需if/else
        PayStrategyEnum strategy = PayStrategyEnum.getByType(payType);
        strategy.pay(amount);
    }
}
        

优势

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

核心作用

定义后端接口的统一响应码和描述,规范前后端交互,避免不同接口返回码混乱,便于前端统一处理。

示例:接口响应码枚举

public enum ResultCodeEnum {
    // 通用响应码
    SUCCESS(200, "操作成功"),
    FAIL(500, "服务器异常"),
    PARAM_ERROR(400, "参数错误"),
    UNAUTHORIZED(401, "未授权,请登录"),
    FORBIDDEN(403, "权限不足,禁止访问"),
    NOT_FOUND(404, "资源不存在"),

    // 业务响应码
    USER_NOT_EXIST(1001, "用户不存在"),
    PASSWORD_ERROR(1002, "密码错误"),
    ORDER_NOT_EXIST(2001, "订单不存在");

    private final Integer code;
    private final String message;

    ResultCodeEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }

    public static String getMessageByCode(Integer code) {
        for (ResultCodeEnum resultCode : ResultCodeEnum.values()) {
            if (resultCode.getCode().equals(code)) {
                return resultCode.getMessage();
            }
        }
        return "未知错误";
    }

    // Getter
    public Integer getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
        

配套统一响应类

public class Result<T> {
    private Integer code;
    private String message;
    private T data;

    // 成功响应(带数据)
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setCode(ResultCodeEnum.SUCCESS.getCode());
        result.setMessage(ResultCodeEnum.SUCCESS.getMessage());
        result.setData(data);
        return result;
    }

    // 失败响应(自定义响应码)
    public static <T> Result<T> fail(ResultCodeEnum resultCode) {
        Result<T> result = new Result<>();
        result.setCode(resultCode.getCode());
        result.setMessage(resultCode.getMessage());
        return result;
    }

    // Getter & Setter
    public Integer getCode() { return code; }
    public void setCode(Integer code) { this.code = code; }
    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }
    public T getData() { return data; }
    public void setData(T data) { this.data = data; }
}
        

接口使用示例

@RestController
@RequestMapping("/user")
public class UserController {
    @GetMapping("/info/{id}")
    public Result<User> getUserInfo(@PathVariable Integer id) {
        User user = userService.getById(id);
        if (user == null) {
            return Result.fail(ResultCodeEnum.USER_NOT_EXIST);
        }
        return Result.success(user);
    }
}
        

优势

总结与最佳实践

应用场景 核心优势 适用场景
状态/类型定义 类型安全、可读性强、集中维护 订单状态、用户角色、数据字典等固定状态
策略模式 消除分支、开闭原则、逻辑内聚 支付方式、消息推送、导出格式等多分支业务
统一返回码 规范交互、便于维护、可读性强 后端接口响应、错误码定义等跨端交互场景

注意事项