一、什么是枚举
枚举(Enum)是Java中一种特殊的类,用于定义一组固定的常量。比如星期、季节、订单状态等,用枚举表示比用int或String更安全、更清晰。
基本语法:
enum Weekday {
MON, TUE, WED, THU, FRI, SAT, SUN
}
AI写代码
java
运行
枚举自带values()、ordinal()等方法,还可以添加属性和自定义方法。
二、场景1:状态/类型定义(最常用!)
用枚举表示有限个状态或类型
适用场景
- 订单状态(待支付、已支付、已发货、已完成)
- 用户角色(管理员、普通用户、访客)
- 任务优先级(高、中、低)
订单状态管理代码示例
enum OrderState {
PENDING, // 待支付
PAID, // 已支付
SHIPPED, // 已发货
COMPLETED, // 已完成
CANCELLED; // 已取消
// 判断是否可以取消
public boolean isCancelable() {
return this == PENDING || this == PAID;
}
}
class Order {
private int id;
private OrderState state;
public Order(int id) {
this.id = id;
this.state = OrderState.PENDING;
}
public void pay() {
if (state == OrderState.PENDING) {
state = OrderState.PAID;
System.out.println(“订单” + id + “支付成功”);
} else {
System.out.println(“订单” + id + “状态异常,无法支付”);
}
}
public void cancel() {
if (state.isCancelable()) {
state = OrderState.CANCELLED;
System.out.println(“订单” + id + “已取消”);
} else {
System.out.println(“订单” + id + “当前状态不可取消”);
}
}
public void showState() {
System.out.println(“订单” + id + “状态:” + state);
}
}
public class Demo1_State {
public static void main(String[] args) {
Order order = new Order(1001);
order.showState(); // 待支付
order.pay(); // 支付成功
order.cancel(); // 已支付状态下可取消
order.showState(); // 已取消
}
}
AI写代码
java
运行
运行结果
订单1001状态:PENDING
订单1001支付成功
订单1001已取消
订单1001状态:CANCELLED
AI写代码
三、场景2:策略模式(替换大量 if/else)
每个枚举常量实现自己的业务逻辑,消除长长的分支判断
适用场景
- 计算器(加、减、乘、除)
- 折扣计算(打折、满减、赠品)
- 排序算法 (升序、降序)
代码实现
enum Calculator {
ADD {
public double apply(double a, double b) {
return a + b;
}
},
SUB {
public double apply(double a, double b) {
return a - b;
}
},
MUL {
public double apply(double a, double b) {
return a * b;
}
},
DIV {
public double apply(double a, double b) {
if (b == 0) throw new ArithmeticException(“除数不能为0”);
return a / b;
}
};
public abstract double apply(double a, double b);
}
public class Demo2_Strategy {
public static void main(String[] args) {
double x = 10, y = 3;
System.out.println(x + “ + “ + y + “ = “ + Calculator.ADD.apply(x, y));
System.out.println(x + “ - “ + y + “ = “ + Calculator.SUB.apply(x, y));
System.out.println(x + “ * “ + y + “ = “ + Calculator.MUL.apply(x, y));
System.out.println(x + “ / “ + y + “ = “ + Calculator.DIV.apply(x, y));
}
}
AI写代码
java
运行
运行结果
10.0 + 3.0 = 13.0
10.0 - 3.0 = 7.0
10.0 * 3.0 = 30.0
10.0 / 3.0 = 3.3333333333333335
AI写代码
代码优势
传统 if-else 实现方式:
if (op.equals(“ADD”)) {
return a + b;
} else if (op.equals(“SUB”)) {
return a - b;
}
// 其他操作…
AI写代码
java
运行
枚举策略模式优势:
代码结构更清晰
扩展性更强
减少重复代码
类型安全
四、场景3:统一返回码(后端接口必备)
用枚举管理API返回的状态码 和提示信息
适用场景
- RESTful API 响应(成功码200,错误码400/401/500等)
- 业务错误码(用户不存在、密码错误等)
统一响应封装代码示例
enum ResultCode {
SUCCESS(200, “成功”),
BAD_REQUEST(400, “请求参数错误”),
UNAUTHORIZED(401, “未授权”),
NOT_FOUND(404, “资源不存在”),
SERVER_ERROR(500, “服务器内部错误”),
USER_NOT_EXIST(1001, “用户不存在”),
PASSWORD_WRONG(1002, “密码错误”);
private final int code;
private final String msg;
ResultCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() { return code; }
public String getMsg() { return msg; }
}
class ApiResult {
private int code;
private String message;
private Object data;
private ApiResult(int code, String message, Object data) {
this.code = code;
this.message = message;
this.data = data;
}
public static ApiResult success(Object data) {
return new ApiResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), data);
}
public static ApiResult error(ResultCode resultCode) {
return new ApiResult(resultCode.getCode(), resultCode.getMsg(), null);
}
@Override
public String toString() {
return "{code:" + code + ", message:" + message + ", data:" + data + "}";
}
}
public class Demo3_ResultCode {
public static void main(String[] args) {
// 模拟登录接口返回
String username = “test”;
String password = “123”;
if (!"admin".equals(username)) {
System.out.println(ApiResult.error(ResultCode.USER_NOT_EXIST));
} else if (!"123456".equals(password)) {
System.out.println(ApiResult.error(ResultCode.PASSWORD_WRONG));
} else {
System.out.println(ApiResult.success("登录成功,token=xxx"));
}
// 打印所有返回码
System.out.println("\n所有返回码:");
for (ResultCode code : ResultCode.values()) {
System.out.println(code.getCode() + " -> " + code.getMsg());
}
}
}
AI写代码
java
运行
运行结果示例
{code:1001, message:用户不存在, data:null}
所有返回码:
200 -> 成功
400 -> 请求参数错误
401 -> 未授权
404 -> 资源不存在
500 -> 服务器内部错误
1001 -> 用户不存在
1002 -> 密码错误
AI写代码
五、总结
枚举的高级应用场景
场景 解决的问题 技术要点
状态/类型定义 避免魔法数字/字符串 枚举常量 + 属性 + 方法
策略模式 消除大量 if-else 抽象方法 + 常量各自实现
统一返回码 集中管理错误码 枚举 + 自定义构造器
枚举不仅仅是“常量列表”,更是一种强大的面向对象 工具。掌握这三种用法可以让代码更优雅、更安全。
六、作业心得
本次作业让我深刻理解了枚举在实际开发中的价值,尤其是策略模式替换if-else的思路,非常实用。