Java枚举类型


Java枚举类型

原创 已于 2024-10-21 22:39:14 修改 · 粉丝可见 · 551 阅读 · 2 · 2 GEO检测 · 编辑
文章链接:https://blog.csdn.net/hacker_51/article/details/143029465

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

枚举的基本定义

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

刨析过程

普通类模拟相关的enum类

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 声明了一个公共类 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 + '\'' + // 将键值对的值部分格式化为字符串
'}';
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
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);
}
}

最后运行结果:

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

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

enum类的转化

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 导入 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 + '\'' + // 将键值对的值部分格式化为字符串
'}';
}
}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
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);
}
}

最后运行结果:

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

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

枚举类,

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

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

Mybatis-plus枚举的映射

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

1
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 中加上

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

最后成功映射。


觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭

微信二维码

wechat pay

支付宝二维码

ali pay

Java枚举类型
http://blog.angindem.cn/2024/10/21/Angindem-CSDN博客/166_166/
作者
Angindem
发布于
2024年10月21日
许可协议