26.4.29

在Java开发中,枚举(Enum)不是简单的“常量集合”,而是一种类型安全、可读性强的工具。今天我们就结合三个最常用的场景,把枚举用透。

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

在订单、用户、流程等场景中,枚举可以完美替代零散的常量,避免魔法值,同时提供类型安全。

示例:订单状态枚举

public enum OrderStatus {

    // 定义所有状态

    UNPAID(0, "未支付"),

    PAID(1, "已支付"),

    DELIVERED(2, "已发货"),

    FINISHED(3, "已完成"),

    CANCELLED(4, "已取消");

    private final int code;

    private final String desc;

    OrderStatus(int code, String desc) {

        this.code = code;

        this.desc = desc;

    }

    // 根据code获取枚举

    public static OrderStatus getByCode(int code) {

        for (OrderStatus status : OrderStatus.values()) {

            if (status.code == code) {

                return status;

            }

        }

        return null;

    }

    // getters

    public int getCode() { return code; }

    public String getDesc() { return desc; }

}

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

当需要根据不同类型执行不同逻辑时,枚举可以把每个分支的逻辑封装到枚举实例中,彻底消灭if/else。

示例:支付方式策略枚举

public enum PayStrategy {

    ALIPAY {

        @Override

        public void pay(double amount) {

            System.out.println("使用支付宝支付:" + amount + "元");

        }

    },

    WECHAT {

        @Override

        public void pay(double amount) {

            System.out.println("使用微信支付:" + amount + "元");

        }

    },

    BANK {

        @Override

        public void pay(double amount) {

            System.out.println("使用银行卡支付:" + amount + "元");

        }

    };

    // 抽象方法,每个枚举实例必须实现

    public abstract void pay(double amount);

}

// 调用方式

public class Test {

    public static void main(String[] args) {

        PayStrategy.ALIPAY.pay(100.0);

        PayStrategy.WECHAT.pay(200.0);

    }

}

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

后端接口的返回码、提示信息,用枚举统一管理,避免返回码重复、提示信息不一致的问题。

示例:接口返回码枚举

public enum ResultCode {

    SUCCESS(200, "操作成功"),

    FAIL(500, "服务器异常"),

    PARAM_ERROR(400, "参数错误"),

    UNAUTHORIZED(401, "未授权"),

    NOT_FOUND(404, "资源不存在");

    private final int code;

    private final String message;

    ResultCode(int code, String message) {

        this.code = code;

        this.message = message;

    }

    // getters

    public int getCode() { return code; }

    public String getMessage() { return message; }

}

// 统一返回结果类

public class Result<T> {

    private int code;

    private String message;

    private T data;

    // 快速构建成功/失败结果

    public static <T> Result<T> success(T data) {

        Result<T> r = new Result<>();

        r.setCode(ResultCode.SUCCESS.getCode());

        r.setMessage(ResultCode.SUCCESS.getMessage());

        r.setData(data);

        return r;

    }

    public static <T> Result<T> fail(ResultCode code) {

        Result<T> r = new Result<>();

        r.setCode(code.getCode());

        r.setMessage(code.getMessage());

        return r;

    }

    // getters and setters

}

枚举的核心优势是类型安全、可读性强、易于维护。开发中遇到状态、策略、返回码这类场景,优先用枚举替代常量和if/else,代码会更干净、更健壮。

更多推荐