JAVA枚举进阶用法

45 阅读1分钟

枚举用法

目前项目开发过程中,一个实体可能有四五种状态,那么列举这些状态就可以枚举来进行定义,避免后期混乱,但是也只是为了解释字段的不同类型都代表着什么,我没想到可以把枚举作为一个对象的字段可以直接在前端传递的参数和数据库字段直接映射

定义一个枚举类:重点在于@JsonFormat(shape = JsonFormat.Shape.OBJECT)、@JsonCreator 、 @EnumValue,这三个地方可以说完美解决了我下面的两个问题。

@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT) // 让响应以对象形式展示 {code, desc}
public enum OrderStatus {
   PROCESSING(1, "处理中"),
   COMPLETED(2, "已完成"),
   CANCELED(3, "已取消");

   @EnumValue
   private final int code;
   private final String desc;

   @JsonCreator // 支持前端传 code 时自动反序列化
   public static OrderStatus fromCode(int code) {
       for (OrderStatus status : values()) {
           if (status.code == code) {
               return status;
           }
       }
       throw new IllegalArgumentException("无效的状态码: " + code);
   }
}

作为前端请求参数中的一个对象

请求参数:这里就可以大胆使用枚举来作为请求参数了,因为前端传数字,会自动映射为枚举类型

import lombok.Data;
@Data
public class OrderQueryParam {
    private Long orderId;
    private OrderStatus status;
}

作为数据库的一个字段

这里就可以直接把枚举映射到数据库对应的字段了,数据库存储的是枚举的code。但要注意的是,这里只有在Mybatis-plus环境下才可以使用

  @TableField("status")
  private OrderStatus status;
 

总结:

需求实现方式
前端传 code 而不是 name@JsonCreator 配合自定义构造方法
返回响应包含 code + desc@JsonFormat(shape = OBJECT)
数据库存储用 @EnumValue只影响 MyBatis-Plus,和前端无关
统一枚举结构建议所有枚举实现统一接口,如 BaseEnum
-----------------------