非常典型和高效的枚举类写法

目录

1、讲讲好处

2、例子

(1)枚举类:

(2)DTO类:

3、根据上面例子进行具体讲解


1、讲讲好处

在使用这种标准枚举模式编写业务逻辑时,可以直接通过枚举成员来表示状态,不需要担心底层的 value 或描述信息,使代码更简洁。

枚举类会 handles 序列化和反序列化的过程,确保:

  1. 在返回JSON时,自动序列化为 value 或描述信息

  2. 在接收前端数据时,自动根据 value 反序列化为枚举成员

  3. 在保存到数据库时,自动转换为对应的 value 值

  4. 在读取数据库数据时,自动根据 value 转换为枚举成员

所以我们只需要在业务代码中直接使用枚举成员,不需要做任何额外的处理,枚举类会负责与底层值的转换,使业务代码精简和高效。


2、例子

(1)枚举类:

java 复制代码
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import com.tianji.common.enums.BaseEnum;
import lombok.Getter;

@Getter //使用@Getter注解自动生成getter方法
public enum SectionType implements BaseEnum { //实现BaseEnum接口,标识这是一个枚举类
    VIDEO(1, "视频"),
    EXAM(2, "考试"),
    ;
    @JsonValue //把value值返回给前端(在JSON序列化时返回value的值)
    @EnumValue //把枚举的value转成数据库需要的
    int value;
    String desc;

    SectionType(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }


    @JsonCreator(mode = JsonCreator.Mode.DELEGATING) //前端提交form表单,of方法:将value转变成对应的枚举
    public static SectionType of(Integer value){
        if (value == null) {
            return null;
        }
        for (SectionType status : values()) {
            if (status.equalsValue(value)) {
                return status;
            }
        }
        return null;
    }
}

(2)DTO类:

当前端form表单提交数据给后端时,其中一个参数是这个枚举类中的枚举值。

此时后端通过DTO类来接收数据,其中定义一个成员属性,举个例子:

@EnumValid 注解来验证枚举值的合法性

@EnumValid 注解的主要参数:

  • enumeration:指定一个合法的枚举值数组,这里是{1, 2},枚举的 value 值

  • message:验证不通过时的错误提示信息

java 复制代码
@Data
@ApiModel(description = "学习记录")
public class LearningRecordFormDTO {

    @ApiModelProperty("小节类型:1-视频,2-考试")
    @NotNull(message = "小节类型不能为空")
    @EnumValid(enumeration = {1, 2}, message = "小节类型错误,只能是:1-视频,2-考试")
    private SectionType sectionType;

}

3、根据上面例子进行具体讲解

这是一种典型的枚举类写法,具有以下几个特点:

  1. 使用@Getter注解自动生成getter方法

  2. 实现BaseEnum接口,标识这是一个枚举类

  3. 每个枚举成员都有一个int类型的value字段,表示数据库存储的值

  4. 使用@JsonValue注解,在JSON序列化时返回value的值

  5. 使用@EnumValue注解,将value值转成数据库字段

  6. 提供一个of方法,可以通过value值获取对应的枚举实例

  7. of方法使用@JsonCreator注解,允许通过JSON反序列化获取枚举

  8. of方法实现通过value值查找枚举实例的逻辑

  9. 加入对null值的处理,保证健壮性总体来说,这种枚举类实现了将枚举值与数据库值映射的功能,同时可以方便的进行JSON序列化和反序列化。

10.配合标准枚举类写法,通过 @EnumValid 注解可以非常方便地实现自定义的枚举值验证,提高代码的健壮性。

相关推荐
Q26433650232 分钟前
【有源码】基于SpringBoot+Vue的博物馆展览与服务一体化平台-java博物馆数字化展品展示与交互平台设计
java·vue.js·spring boot·spring·毕业设计·javaweb·课程设计
guo_wen_qiang7 分钟前
项目使用sentinel遇到的问题
java·sentinel
CarIise12 分钟前
IDEA与Maven基础课堂笔记
java·intellij-idea·caffe
小溪学编程18 分钟前
C语言篇:枚举类型
java·c语言·前端
云和数据.ChenGuang27 分钟前
JAVAEE AI工程师路线图
java·人工智能·java-ee·fastapi·springai·langchain4j
2601_9628857227 分钟前
如何用 Python 统计 A 股连续涨停(几连板)?
java·linux·python
大圣编蚕1 小时前
Spring AOP 失效排查:从原理到实战的完整指南
java·后端·spring
EatFan1 小时前
MCP 从概念到落地:Java(Spring AI Alibaba)与 .NET 双栈接入实操对比
java·人工智能·后端·spring·.net·java后端·mcp
专业程序开发源1 小时前
springboot全民健身和饮食健康管理系统29158-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
ym hyd 1111 小时前
汽车零部件缺陷管理系统源码 Java+SpringBoot+Vue3 前后分离
java·vue.js·spring boot·汽车·毕设