一、场景 1:状态与类型的标准化定义(最常用!)
这是枚举最基础也最重要的用法。在数据库设计和业务逻辑中,我们经常会遇到各种“状态”字段,比如订单状态(待支付、已支付、已发货)、用户角色(管理员、普通用户)等。
不用数字或字符串的原因:
数字(Magic Number):代码里出现 if (status == 1) ,没人知道 1 代表什么,维护起来像猜谜。
字符串:容易拼写错误,且占用内存相对较大。
枚举的优势
使用枚举可以将这些离散的值封装成一个具体的类型。例如定义一个 OrderStatus 枚举,代码就变成了 if (status == OrderStatus.PAID) 。这不仅具有自文档化的特性(代码即注释),还能在编译期就杜绝非法值的传入,保证数据的绝对安全。
💡 最佳实践:
建议在枚举中自定义属性(如 code 和 desc ),分别对应数据库存储的值和前端展示的描述,实现存储与展示的分离。
二、场景 2:策略模式的轻量化实现(替换大量 if/else)
当代码中出现类似这样的结构时,警报应该拉响了:
if (type == "A") {
// 执行逻辑 A
} else if (type == "B") {
// 执行逻辑 B
} else if (type == "C") {
// 执行逻辑 C
}
这种大量的 if/else 或 switch 分支不仅难以阅读,而且违反了“开闭原则”——每次新增类型都要修改主逻辑代码。
枚举 + 抽象方法
利用枚举可以实现一种轻量级的策略模式。我们可以为枚举定义一个抽象方法,让每个枚举常量去实现自己的具体逻辑。
public enum PayStrategy {
ALIPAY {
@Override
public void pay() { System.out.println("支付宝支付"); }
},
WECHAT {
@Override
public void pay() { System.out.println("微信支付"); }
};
public abstract void pay();
}
调用时只需 strategy.pay() ,彻底消灭了复杂的条件判断语句。当需要新增支付方式时,只需增加一个枚举值,原有代码完全不用动。
三、场景 3:统一接口返回码(后端开发必备)
在现代前后端分离的架构中,后端接口通常需要返回统一的 JSON 格式,例如:
{
"code": 200,
"message": "success",
"data": { ... }
}
这里的 code 和 message 如果散落在各个 Controller 或 Service 中硬编码,一旦需要修改文案或增加新的错误码,工作量巨大且容易遗漏。
构建 ResultCode 枚举
我们可以定义一个专门的 ResultCode 枚举来管理所有的响应状态:
SUCCESS(200, "操作成功")
PARAM_ERROR(400, "参数错误")
AUTH_FAIL(401, "未授权")
SERVER_ERROR(500, "服务器内部错误")
这样,在编写业务逻辑时,直接抛出或返回枚举对象即可。它不仅统一管理了全站的错误码字典,还方便后续对接前端文档或生成 Swagger 接口文档。
