认识一下枚举类型

枚举类型的出现

你一定经历过这样的场景,如果某个属性,它的取值范围是固定的那几个值。例如性别,要么是man,要么是woman,顶多也是unknown,不可能用户上传一个数值sex="沃尔玛购物袋"后端也来接收。

于是乎,出现了这样一个经典场景,必须限定一个参数的取值。

那么在后端如何实现呢?

一开始,我们选择把可选值定死在一个集合里,每次校验参数的时候,都拿去查询一遍不就好了吗?

然而,它有几个问题

  1. 如果集合里的数值写错了,启动起来也没人知道,直到运行报错。
  2. 信息不足,为什么叫这个名字,为什么是这个数值,没人能理解更多信息。
  3. 会产生魔法值,不可避免的字符串、数值被拿来比较,但是却看不懂其含义。
csharp 复制代码
if ("PENDING".equals(status)) { ... }
if ("PAID".equals(status)) { ... }

在这样的环境下,枚举类型出现了。

枚举类型的意义

swift 复制代码
public enum OrderStatus {
    PENDING_PAYMENT,  // 枚举项
    PAID,
    CANCELLED;
}

枚举类型,本质不是一个基础数据类型,而是一个子类对象。

例如OrderStatus.PENDING_PAYMENT,本质是一个单例的子类对象。

既然是一个子类,那么就说明其跟编译相关了,那么使用枚举类,就可以在编译器发现报错。

枚举类也消除了魔法值的问题,与魔法值相比,子类的类名,就是最大的信息量。

arduino 复制代码
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;
    }
}

枚举类自带的看名知意,还为其增加了数值,描述,完美适配这个约束场景。

相关推荐
花间相见2 分钟前
【计算基础|Redis01】【上手】安装连接、配置与通用命令
数据库·后端·面试
我命由我1234513 分钟前
6-3.Python 异常处理 - 异常处理进阶(else 块与 finally 块、异常传递、自定义异常)
开发语言·前端·数据库·后端·python·学习·java-ee
深入云栈19 分钟前
Netty 4.2.x 源码深度解析 (二十一):Pipeline 事件传播 —— Inbound 与 Outbound 的双向流转
java·后端·架构
卷无止境25 分钟前
长篇写作 Skill 横向盘点:从单文件指令到多智能体流水线
后端·python
斯维赤1 小时前
微信步数的10点定时推送,看似简单,实则暗藏玄机
java·后端
RobinDevNotes1 小时前
crontab 管不住时,该上 Airflow 了
后端
系统集成-鹰翔1 小时前
ERP接口月度统计少了零单月份:SQLite分组与最近三个月均值排查
javascript·数据库·经验分享·后端
我的xiaodoujiao1 小时前
Django 权限系统项目实战详细图文教程 3--系统登录功能实现
后端·python·django
SimonKing1 小时前
号外号外,Stream-Nexus推送项目支持集群部署了
java·后端·程序员
老王IT1 小时前
Rust开发环境搭建教程
开发语言·后端·rust