枚举(Enum)是 Java 中特殊的类,相比常量public static final,枚举自带类型约束、可读性强、天然序列化、可绑定业务属性,在后端开发中高频使用。本文结合课堂总结的3 大落地场景,附带可运行代码案例,梳理枚举实战用法。

场景 1:状态 / 类型定义

适用场景

订单状态、支付状态、用户账号状态、商品类型等固定有限取值的业务字段,替代零散数字 / 字符串常量,避免魔法值。

痛点:传统常量弊端

0=待付款、1=已付款、2=已取消数字常量,代码可读性差,传参时可随意传入 999 非法数字,无法做参数校验。

枚举示例:订单状态

// 订单状态枚举
public enum OrderStatusEnum {
    // 枚举实例:状态码、描述
    PENDING_PAY(0, "待付款"),
    PAID(1, "已付款"),
    CANCEL(2, "已取消");

    private final Integer code;
    private final String desc;

    // 私有构造
    OrderStatusEnum(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    // getter
    public Integer getCode() { return code; }
    public String getDesc() { return desc; }

    // 根据code反向查找枚举(业务常用)
    public static OrderStatusEnum getByCode(Integer code) {
        for (OrderStatusEnum status : values()) {
            if (status.getCode().equals(code)) {
                return status;
            }
        }
        throw new IllegalArgumentException("无效订单状态码:" + code);
    }
}

场景 2:策略模式

适用场景

不同类型走不同业务逻辑(支付渠道:微信 / 支付宝 / 银行卡、优惠券类型:满减 / 折扣 / 无门槛),大量if-else if代码臃肿难维护,利用枚举绑定业务逻辑实现策略分发。

示例:多渠道支付

// 支付策略枚举,每个枚举自带支付逻辑
public enum PayChannelEnum {
    // 微信支付
    WECHAT_PAY(1, "微信支付") {
        @Override
        public void pay(Long orderId, BigDecimal money) {
            System.out.println("调用微信SDK,订单"+orderId+",支付金额"+money);
        }
    },
    // 支付宝
    ALI_PAY(2, "支付宝支付") {
        @Override
        public void pay(Long orderId, BigDecimal money) {
            System.out.println("调用支付宝SDK,订单"+orderId+",支付金额"+money);
        }
    },
    // 银行卡
    BANK_PAY(3, "银行卡支付") {
        @Override
        public void pay(Long orderId, BigDecimal money) {
            System.out.println("调用银联SDK,订单"+orderId+",支付金额"+money);
        }
    };

    private final Integer channelCode;
    private final String channelName;

    PayChannelEnum(Integer channelCode, String channelName) {
        this.channelCode = channelCode;
        this.channelName = channelName;
    }

    // 抽象支付方法,由每个枚举实例实现各自逻辑
    public abstract void pay(Long orderId, BigDecimal money);

    // getter + 根据编码获取枚举
    public static PayChannelEnum getByCode(Integer code){
        for(PayChannelEnum item:values()){
            if(item.channelCode.equals(code)) return item;
        }
        throw new RuntimeException("不支持的支付渠道");
    }

    public Integer getChannelCode() { return channelCode; }
}

场景 3:统一返回码

适用场景

后端 RESTful 接口全局统一返回体,定义业务错误码:成功、参数错误、未登录、权限不足、业务异常等,前后端约定编码规范。

示例:全局响应码枚举

// 全局接口返回码枚举
public enum ResultCodeEnum {
    // 成功
    SUCCESS(200, "操作成功"),
    // 客户端错误
    PARAM_ERROR(400, "请求参数非法"),
    UNAUTHORIZED(401, "未登录,请先登录"),
    FORBIDDEN(403, "权限不足,禁止访问"),
    // 服务端异常
    SERVER_ERROR(500, "服务器繁忙,请稍后重试"),
    BUSINESS_FAIL(5001, "业务处理失败");

    private final Integer code;
    private final String msg;

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

    // getter
    public Integer getCode() { return code; }
    public String getMsg() { return msg; }
}

// 统一返回实体
@Data
public class Result<T> {
    private Integer code;
    private String message;
    private T data;

    // 快捷返回成功
    public static <T> Result<T> success(T data){
        Result<T> res = new Result<>();
        res.setCode(ResultCodeEnum.SUCCESS.getCode());
        res.setMessage(ResultCodeEnum.SUCCESS.getMsg());
        res.setData(data);
        return res;
    }
    // 快捷返回失败
    public static <T> Result<T> fail(ResultCodeEnum codeEnum){
        Result<T> res = new Result<>();
        res.setCode(codeEnum.getCode());
        res.setMessage(codeEnum.getMsg());
        return res;
    }
}

更多推荐