枚举类型的出现
你一定经历过这样的场景,如果某个属性,它的取值范围是固定的那几个值。例如性别,要么是man,要么是woman,顶多也是unknown,不可能用户上传一个数值sex=”沃尔玛购物袋“后端也来接收。
于是乎,出现了这样一个经典场景,必须限定一个参数的取值。
那么在后端如何实现呢?
一开始,我们选择把可选值定死在一个集合里,每次校验参数的时候,都拿去查询一遍不就好了吗?
然而,它有几个问题
- 如果集合里的数值写错了,启动起来也没人知道,直到运行报错。
- 信息不足,为什么叫这个名字,为什么是这个数值,没人能理解更多信息。
- 会产生魔法值,不可避免的字符串、数值被拿来比较,但是却看不懂其含义。
if ("PENDING".equals(status)) { ... }
if ("PAID".equals(status)) { ... }
在这样的环境下,枚举类型出现了。
枚举类型的意义
public enum OrderStatus {
PENDING_PAYMENT, // 枚举项
PAID,
CANCELLED;
}
枚举类型,本质不是一个基础数据类型,而是一个子类对象。
例如OrderStatus.PENDING_PAYMENT,本质是一个单例的子类对象。
既然是一个子类,那么就说明其跟编译相关了,那么使用枚举类,就可以在编译器发现报错。
枚举类也消除了魔法值的问题,与魔法值相比,子类的类名,就是最大的信息量。
public enum ResultCode {
SUCCESS(200, "成功"),
ERROR(500, "服务器异常"),
NOT_FOUND(404, "资源不存在");
public final int code;
public final String msg;
ResultCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
}
枚举类自带的看名知意,还为其增加了数值,描述,完美适配这个约束场景。