Java枚举类型

Java 枚举(Enum)类型是一种特殊的类,它用于表示一组固定的常量。枚举提供了一种类型安全的方式来处理一组有限的常量值。从 Java 5 开始,枚举类型被正式引入,并且成为了 Java 语言的一部分。

枚举的基本定义

枚举类型的定义使用关键字 enum,后面跟着枚举的名称。枚举的每个实例称为枚举常量。

刨析过程

普通类模拟相关的enum类

Java 5之前通过普通类来定义我们需要的枚举常量。

// 声明了一个公共类 myClassEnum,它将用于表示具有特定键和值的枚举类型
public class myClassEnum {

    // 定义了两个私有的字符串变量,用于存储枚举实例的键和值
    private String key;
    private String value;

    // 定义了两个公共的静态最终变量 ADMIN 和 USER,它们是 myClassEnum 类的实例
    // 这些实例在创建时就被初始化,分别代表 "管理员" 和 "用户" 角色
    // 通过将构造函数设置为私有,确保这些实例是该类唯一的实例,并且常量化无法修改
    public static final myClassEnum ADMIN = new myClassEnum("ADMIN","管理员");
    public static final myClassEnum USER = new myClassEnum("USER","用户");

    // 定义了一个无参的构造函数,它不执行任何操作
    // 这个构造函数通常用于创建不包含键和值的枚举实例,或者在子类中被重写
    // 构造器私有化,这样外界就不能直接创建对象,防止被直接new
    myClassEnum(){}

    // 定义了一个带有两个参数的私有构造函数,用于创建包含特定键和值的枚举实例
    // 将构造函数设置为私有,确保只能通过类内部创建实例,增加了封装性
    private myClassEnum(String key, String value) {
        this.key = key; // 将传入的键赋值给实例变量 key
        this.value = value; // 将传入的值赋值给实例变量 value
    }

    // 定义了一个公共的 getKey 方法,用于获取枚举实例的键
    public String getKey() {
        return key;
    }

    // 定义了一个公共的 getValue 方法,用于获取枚举实例的值
    public String getValue() {
        return value;
    }

    // 重写了 Object 类的 toString 方法,提供了一种字符串表示形式来描述枚举实例
    // 当打印枚举实例或将其转换为字符串时,会调用此方法
    @Override
    public String toString() {
        return "myClassEnum{" +
                "key='" + key + '\'' + // 将键值对的键部分格式化为字符串
                ", value='" + value + '\'' + // 将键值对的值部分格式化为字符串
                '}';
    }
}

测试类:

public class test {
    public static void main(String[] args) {

        myClassEnum userClassEnum = myClassEnum.USER;

        System.out.println(userClassEnum);

        myClassEnum adminClassEnum = myClassEnum.ADMIN;

        System.out.println(adminClassEnum);
    }
}

最后运行结果:

myClassEnum{key='USER', value='用户'}
myClassEnum{key='ADMIN', value='管理员'}

我们可以通过调用这个枚举类绑定相关常量,对应常量之间关系的映射。通过get方法进行取值。

enum类的转化

通过不断发展,enum的枚举类逐渐简易化

// 导入 Lombok 提供的 Getter 注解和无参构造函数注解
import lombok.Getter;
import lombok.NoArgsConstructor;

// 导入 MyBatis Plus 提供的 EnumValue 注解,用于指定枚举的数据库存储值
import com.baomidou.mybatisplus.annotation.EnumValue;
// 导入 Jackson 提供的 JsonValue 注解,用于指定枚举的 JSON 序列化值
import com.fasterxml.jackson.annotation.JsonValue;

// 使用 @Getter 注解自动为所有字段生成 getter 方法
@Getter
// 使用 @NoArgsConstructor 注解自动生成无参构造函数
@NoArgsConstructor
// 声明一个名为 MyEnum 的枚举类型
public enum MyEnum {

    // 枚举常量,每个常量都是 MyEnum 类的一个实例
    e_ADMIN("e_ADMIN","超级管理员"),
    e_USER("e_USER","普通用户");

    // 使用 @EnumValue 注解指定枚举的数据库存储值
    @EnumValue
    private String key;

    // 使用 @JsonValue 注解指定枚举的 JSON 序列化值
    @JsonValue
    private String value;

    // 枚举构造函数,用于初始化枚举实例的键和值
    MyEnum(String key, String value) {
        this.key = key; // 将传入的键赋值给实例变量 key
        this.value = value; // 将传入的值赋值给实例变量 value
    }

    // 重写了 Object 类的 toString 方法,提供了一种字符串表示形式来描述枚举实例
    @Override
    public String toString() {
        return "MyEnum{" +
                "key='" + key + '\'' + // 将键值对的键部分格式化为字符串
                ", value='" + value + '\'' + // 将键值对的值部分格式化为字符串
                '}';
    }
}

测试类:

public class test {
    public static void main(String[] args) {

        MyEnum userEnum = MyEnum.e_USER;

        System.out.println(userEnum);

        MyEnum adminEnum = MyEnum.e_ADMIN;

        System.out.println(adminEnum);
    }
}

最后运行结果:

MyEnum{key='e_USER', value='普通用户'}
MyEnum{key='e_ADMIN', value='超级管理员'}

其中,注意枚举的常量值只能在前面,而后声明相应的变量和方法。

枚举类,

使用 @EnumValue 注解指定枚举的数据库存储值,即将 枚举类型 存储在数据库时,会调用 getKey()方法的值进行存储。

使用 @JsonValue 注解指定枚举的 JSON 序列化值,   即将 枚举类型包装成Json格式时,会调用getValue()方法的值进行包装。

Mybatis-plus枚举的映射

练习的时候遇到了 以下报错

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'status' from result set.  Cause: java.lang.IllegalArgumentException: No enum constant enums.StatusType.1

这是由于Mybatis 扫描不精确,导致无法成功映射相应的枚举变量

只需要在配置文件  application.yaml 中加上

mybatis-plus:
  type-enums-package: 你的枚举变量报名.enums

最后成功映射。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值