在系统开发里,状态码和描述信息通常用于标识业务处理结果、错误类型等内容,如果分散在各个业务代码中硬编码定义,后续修改和排查问题会非常麻烦。使用枚举类enum可以集中管理这些信息,实现全局统一且类型安全的定义。

枚举类enum的基本特性
枚举类是Java等编程语言中一种特殊的类,它的实例是预先定义好的有限集合,每个实例都可以有自己的属性和方法。用枚举类定义状态码的优势在于:所有状态码集中在一个类中,修改时只需要调整枚举类即可;枚举类型是强类型,编译器会检查赋值是否合法,避免传入无效的状态码;可以很方便地为每个状态码绑定对应的描述信息。
定义状态码枚举类的实现步骤
1. 定义枚举类的属性和构造方法
首先需要在枚举类中定义两个核心属性,分别是状态码code和描述信息desc,同时提供对应的构造方法,让每个枚举实例初始化时绑定这两个值。
public enum StatusCodeEnum {
// 枚举实例,每个实例对应一个状态码和描述
SUCCESS(200, "操作成功"),
PARAM_ERROR(400, "参数错误"),
UNAUTHORIZED(401, "未授权"),
NOT_FOUND(404, "资源不存在"),
SERVER_ERROR(500, "服务器内部错误");
// 状态码属性
private final Integer code;
// 描述信息属性
private final String desc;
// 构造方法,枚举类的构造方法默认是private的,不需要显式声明
StatusCodeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
// 提供get方法获取属性值
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
}
2. 添加根据状态码获取描述的方法
实际业务中经常需要根据传入的状态码获取对应的描述信息,我们可以在枚举类中添加一个静态方法来实现这个功能。
public enum StatusCodeEnum {
SUCCESS(200, "操作成功"),
PARAM_ERROR(400, "参数错误"),
UNAUTHORIZED(401, "未授权"),
NOT_FOUND(404, "资源不存在"),
SERVER_ERROR(500, "服务器内部错误");
private final Integer code;
private final String desc;
StatusCodeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public Integer getCode() {
return code;
}
public String getDesc() {
return desc;
}
// 根据状态码获取对应的描述信息
public static String getDescByCode(Integer code) {
if (code == null) {
return null;
}
for (StatusCodeEnum status : StatusCodeEnum.values()) {
if (status.getCode().equals(code)) {
return status.getDesc();
}
}
return "未知状态码";
}
}
枚举类在业务中的使用示例
定义好枚举类之后,在业务代码中就可以直接引用,避免硬编码状态码。比如在接口返回结果封装的场景中,我们可以这样使用:
public class Result {
private Integer code;
private String msg;
private Object data;
public Result(Integer code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
// 成功返回的静态方法
public static Result success(Object data) {
return new Result(StatusCodeEnum.SUCCESS.getCode(), StatusCodeEnum.SUCCESS.getDesc(), data);
}
// 失败返回的静态方法,传入对应的枚举实例
public static Result error(StatusCodeEnum statusCodeEnum) {
return new Result(statusCodeEnum.getCode(), statusCodeEnum.getDesc(), null);
}
// getter和setter省略
}
// 业务层调用示例
public class UserService {
public Result getUserById(Integer id) {
if (id == null || id <= 0) {
// 直接引用枚举实例,不需要硬编码400
return Result.error(StatusCodeEnum.PARAM_ERROR);
}
// 模拟查询用户
Object user = new Object();
return Result.success(user);
}
}
注意事项
- 枚举类的实例定义要放在类的第一行,多个实例之间用逗号分隔,最后一个实例后面加分号。
- 如果状态码需要支持扩展,新增枚举实例即可,不需要修改其他业务代码,符合开闭原则。
- 枚举类的属性通常定义为final类型,避免实例创建后被修改,保证状态的一致性。
- 如果系统中有多个模块的状态码需要区分,可以定义多个不同的枚举类,比如UserStatusCodeEnum、OrderStatusCodeEnum等,分别管理不同模块的状态信息。
通过这种方式定义的全局状态码,所有业务代码都统一引用枚举类中的实例,后续如果需要调整状态码或者描述信息,只需要修改枚举类的对应内容,所有引用处都会自动生效,大幅降低了维护成本,也减少了因硬编码导致的状态码不一致问题。