在 Java 开发中,enum(枚举)不仅仅是一个简单的“常量集合”。合理利用枚举,不仅能大幅提升代码的可读性和维护性,还能优雅地消除代码中的“魔法值”与繁琐的 if-else。本文将结合实际业务,深入解析枚举的 3 个经典应用场景。

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

这是枚举最基础、也是高频使用的场景。比如在电商系统、订单系统或者用户模块中,我们会定义各种状态(如:订单状态、支付状态)。

❌ 坏味道(使用常量或魔法值)

Java

public class OrderService {
    // 1=待支付,2=已支付,3=已发货
    public void handleOrder(int status) {
        if (status == 1) {
            System.out.println("处理待支付订单...");
        }
    }
}

缺点:代码可读性差,硬编码的数字散落各处,极易出错。

核心实现

Java

public enum OrderStatus {
    PENDING_PAY(1, "待支付"),
    PAID(2, "已支付"),
    SHIPPED(3, "已发货"),
    CANCELED(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; }

    // 根据 code 获取枚举对象(便于前后端交互)
    public static OrderStatus getByCode(int code) {
        for (OrderStatus status : values()) {
            if (status.getCode() == code) {
                return status;
            }
        }
        return null;
    }
}

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

当不同的业务类型对应不同的计算或处理逻辑时,如果写一堆 if-else 或者 switch-case,代码会非常臃肿。我们可以直接在枚举中定义抽象方法,让每个枚举项实现自己的业务逻辑。

❌ 坏味道(传统 if-else 逻辑)

Java

if (userType.equals("VIP")) {
    return price * 0.8;
} else if (userType.equals("SVIP")) {
    return price * 0.7;
} else {
    return price;
}

核心实现

Java

public enum DiscountStrategy {
    NORMAL {
        @Override
        public double calculatePrice(double price) {
            return price; // 原价
        }
    },
    VIP {
        @Override
        public double calculatePrice(double price) {
            return price * 0.8; // 8折
        }
    },
    SVIP {
        @Override
        public double calculatePrice(double price) {
            return price * 0.7; // 7折
        }
    };

    // 定义抽象方法
    public abstract double calculatePrice(double price);
}

使用示例

Java

double finalPrice = DiscountStrategy.VIP.calculatePrice(100.0); // 自动输出 80.0

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

在前后端分离的开发模式中,后端返回给前端的数据通常需要统一格式。枚举常用于定义错误码(Result Code)和错误信息(Message)。

核心实现

Java

public enum ResultCode {
    SUCCESS(200, "操作成功"),
    PARAM_ERROR(400, "参数错误"),
    UNAUTHORIZED(401, "暂未登录或Token过期"),
    FORBIDDEN(403, "没有相关权限"),
    NOT_FOUND(404, "资源不存在"),
    INTERNAL_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)使用

Java

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

    // 快捷成功返回
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.code = ResultCode.SUCCESS.getCode();
        result.message = ResultCode.SUCCESS.getMessage();
        result.data = data;
        return result;
    }

    // 快捷失败返回
    public static <T> Result<T> error(ResultCode resultCode) {
        Result<T> result = new Result<>();
        result.code = resultCode.getCode();
        result.message = resultCode.getMessage();
        return result;
    }
    
    // 省略 getter/setter
}

💡 总结

  1. 场景一 帮我们告别了魔法值,代码含义一目了然。

  2. 场景二 巧妙利用枚举的抽象方法,让高内聚的策略模式变得异常简单。

  3. 场景三 规范了前后端交互的边界,是规范化商业项目不可或缺的基础。

更多推荐