Java的枚举类型
💡解答
Java枚举类型3个应用场景示例
场景1:状态/类型定义(最常用)
适用场景:固定有限的状态、类型集合,比如订单状态、用户性别、任务状态等。
示例代码:订单状态枚举
java
// 订单状态枚举(状态/类型定义)
public enum OrderStatus {
WAIT_PAY("待支付", 1),
PAID("已支付", 2),
DELIVERED("已发货", 3),
COMPLETED("已完成", 4),
CANCELLED("已取消", 5);
private final String desc;
private final int code;
// 枚举构造器必须私有
OrderStatus(String desc, int code) {
this.desc = desc;
this.code = code;
}
public String getDesc() {
return desc;
}
public int getCode() {
return code;
}
// 根据code获取状态
public static OrderStatus getByCode(int code) {
for (OrderStatus status : values()) {
if (status.code == code) {
return status;
}
}
return null;
}
}
使用方式:
java
public class OrderService {
public void handleOrder(OrderStatus status) {
switch (status) {
case WAIT_PAY:
System.out.println("处理待支付订单逻辑");
break;
case PAID:
System.out.println("处理已支付订单逻辑");
break;
// 其他状态...
}
}
}
场景2:策略模式(替换大量if/else)
适用场景:替代多层 if-else / switch-case ,把不同策略封装到枚举成员中,提升代码可维护性。
示例代码:计算器策略枚举
java
// 计算器策略枚举(替换if/else)
public enum CalculatorStrategy {
ADD("加法") {
@Override
public int calculate(int a, int b) {
return a + b;
}
},
SUBTRACT("减法") {
@Override
public int calculate(int a, int b) {
return a - b;
}
},
MULTIPLY("乘法") {
@Override
public int calculate(int a, int b) {
return a * b;
}
},
DIVIDE("除法") {
@Override
public int calculate(int a, int b) {
if (b == 0) throw new IllegalArgumentException("除数不能为0");
return a / b;
}
};
private final String desc;
// 抽象方法,每个枚举成员实现
public abstract int calculate(int a, int b);
CalculatorStrategy(String desc) {
this.desc = desc;
}
public String getDesc() {
return desc;
}
}
使用方式:
java
public class CalcService {
public int execCalc(CalculatorStrategy strategy, int a, int b) {
// 无需if/else,直接调用枚举实现的方法
return strategy.calculate(a, b);
}
}
场景3:统一返回码(后端接口必备)
适用场景:后端接口统一定义响应码、提示信息,规范接口返回格式。
示例代码:接口返回码枚举
java
// 统一接口返回码枚举
public enum ResultCode {
SUCCESS(200, "操作成功"),
ERROR(500, "服务器内部错误"),
PARAM_ERROR(400, "参数错误"),
UNAUTHORIZED(401, "未授权"),
FORBIDDEN(403, "禁止访问"),
NOT_FOUND(404, "资源不存在");
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;
}
// 统一返回结果封装(配合枚举使用)
public static
return new Result<>(SUCCESS.code, SUCCESS.message, data);
}
public static
return new Result<>(code.code, code.message, null);
}
}
// 统一返回结果类
class Result
private int code;
private String message;
private T data;
public Result(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
// getter/setter
public int getCode() { return code; }
public String getMessage() { return message; }
public T getData() { return data; }
}
使用方式:
java
@RestController
public class UserController {
@GetMapping("/user/{id}")
public Result
User user = userService.findById(id);
if (user == null) {
return ResultCode.error(ResultCode.NOT_FOUND);
}
return ResultCode.success(user);
}
}
浙公网安备 33010602011771号