开发中枚举的妙用

131 阅读2分钟

枚举的优势

在我们项目中通常有一些自定义的类型,比如合同状态可以有:
<待签署><签署中><已签署><已生效><已过期><拒签>..等等状态,

这些状态我们可以使用业务码进行区分,我们在数据库设置状态的时候一定是简化设置的业务码,但是我们在代码中难免需要去比较这些状态码是否符合业务要求,所以下面我先介绍枚举如何在项目中使用

基本使用

定义枚举类

通常使用设置不同的状态类型、配置参数,在java中的枚举一般是一个类如下

@Getter
@AllArgsConstructor
public enum StatusRespBack {
    /**
     * 成功
     */
    SUCCESS(0, "成功"),
    /**
     * 失败
     */
    FAIL(500, "失败");
    private static final long serialVersionUID = 1L;

    public Integer status;

    public String statusName;
    
    /**
     * 对应名称
     */
    public static String getStatusName(Integer status) {
        return java.util.Arrays.stream(StatusRespBack.values())
                .filter(item -> item.getStatus().equals(status))
                .findFirst()
                .map(StatusRespBack::getStatusName)
                .orElse(null);
    }
}

常规类比较

相比于我们平常定义的常规类

  • 实例限制:枚举确保只有预定义的实例集合存在,而常规类可以有任意数量的实例。
  • 不可继承:枚举不能被继承,以保持固定的实例集合。
  • 枚举构造器:枚举的构造器是私有的。
  • 自动生成方法:枚举类自动为每个枚举值生成 values()valueOf() 方法,而常规类则不会。

如何在API中调用中使用

  1. 在返回类中设置参数方法
public class User {
    private StatusRespBack statusRespBack;

    // getters and setters
}
  1. 设置返回
try {
    Status status = Status.valueOf(statusValue);
    // logic
} catch (IllegalArgumentException e) {
    // handle invalid status
}

数据验证

如果我们修改了代码中的一个参数,而这个参数使用了几处位置我们忘记就会导致bug的产生,那么如果我们使用枚举,只需要更改枚举中的一处即可

方便阅读

我们在写代码的时候突然出现一个eq(status,1)可能机会懵了,但是如果我们使用了枚举,我们就可以通过枚举的单词意思直接推断出这个枚举所对应的内容是什么了。