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","用户");// 定义了一个无参的构造函数,它不执行任何操作// 这个构造函数通常用于创建不包含键和值的枚举实例,或者在子类中被重写// 构造器私有化,这样外界就不能直接创建对象,防止被直接newmyClassEnum(){}// 定义了一个带有两个参数的私有构造函数,用于创建包含特定键和值的枚举实例// 将构造函数设置为私有,确保只能通过类内部创建实例,增加了封装性private myClassEnum(String key, String value) {this.key = key; // 将传入的键赋值给实例变量 keythis.value = value; // 将传入的值赋值给实例变量 value}// 定义了一个公共的 getKey 方法,用于获取枚举实例的键public String getKey() {return key;}// 定义了一个公共的 getValue 方法,用于获取枚举实例的值public String getValue() {return value;}// 重写了 Object 类的 toString 方法,提供了一种字符串表示形式来描述枚举实例// 当打印枚举实例或将其转换为字符串时,会调用此方法@Overridepublic 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 注解指定枚举的数据库存储值@EnumValueprivate String key;// 使用 @JsonValue 注解指定枚举的 JSON 序列化值@JsonValueprivate String value;// 枚举构造函数,用于初始化枚举实例的键和值MyEnum(String key, String value) {this.key = key; // 将传入的键赋值给实例变量 keythis.value = value; // 将传入的值赋值给实例变量 value}// 重写了 Object 类的 toString 方法,提供了一种字符串表示形式来描述枚举实例@Overridepublic 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()方法的值进行包装。