总结:Java枚举类Enum常用API,与EnumUtil工具类封装
一·通过enum关键字创建一个枚举类:
public enum UserStatus {
Normal(1, "正常"),
Locked(2, "锁定"),
Delete(3, "删除"),
Disabled(4, "禁用"),
NotCertified(5, "未认证");
private Integer code;
private String description;
UserStatus(Integer code, String description) {
this.code = code;
this.description = description;
}
public Integer getCode() {
return code;
}
public String getDescription() {
return description;
}
}
二·自定义枚举对象常用方法示例:
1.获取枚举值方法:一般为code字段
Integer code = UserStatus.Disabled.getCode();
System.out.println(code);
2.获取描述值方法:一般为description字段
String description = UserStatus.Disabled.getDescription();
System.out.println(description);
3.获取枚举对象名称:
String name = UserStatus.Disabled.name();
System.out.println(name);
4.获取枚举对象在枚举类中的索引位置:从0开始计算
int ordinal = UserStatus.Disabled.ordinal();
System.out.println(ordinal);
5.获取枚举对象的序列化方法:一般很少用
Optional<Enum.EnumDesc<UserStatus>> userStatusEnumDesc = UserStatus.Disabled.describeConstable();
System.out.println(userStatusEnumDesc);
6.获取枚举类的class对象:
Class<UserStatus> declaringClass = UserStatus.Disabled.getDeclaringClass();
Class<? extends UserStatus> aClass = UserStatus.Disabled.getClass();
System.out.println(declaringClass == aClass);
三·自定义枚举类,自带静态方法常用示例:
1.获取枚举单个对象:
UserStatus locked = UserStatus.Locked;
System.out.println(locked);
2.根据枚举对象名,获取对应的枚举对象,方式一:
UserStatus normal = UserStatus.valueOf("Normal");
System.out.println(normal);
3.根据枚举对象名,获取对应的枚举对象,方式二:
UserStatus delete = UserStatus.valueOf(UserStatus.class, "Delete");
System.out.println(delete);
4.获取枚举类中全部枚举对象数组集合:
UserStatus[] values = UserStatus.values();
System.out.println(Arrays.toString(values));
四·枚举类Class对象常用方法示例:这块不仅包含枚举相关的API,也涉及class的反射内容方法API
1.获取该类型的全类名:
String typeName = UserStatus.class.getTypeName();
System.out.println(typeName);
2.判断该类是不是枚举类型:
boolean anEnum = UserStatus.class.isEnum();
System.out.println(anEnum);
3.获取枚举对象数组集合:
UserStatus[] enumConstants = UserStatus.class.getEnumConstants();
for (UserStatus enumConstant : enumConstants) {
System.out.println(enumConstant.getCode() + ":" + enumConstant.getDescription());
}
4.获取该类声明的所有属性字段:
Field[] declaredFields = UserStatus.class.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
五·枚举类父类,Enum常用方法示例:
1.根据枚举对象名,获取对应的枚举对象,方式三:
UserStatus normal_1 = Enum.valueOf(UserStatus.class, "Normal");
System.out.println(normal_1);
六·EnumUtil工具类封装:各种枚举类本身不具备,但是开发中经常需要使用的功能方法
import com.alibaba.fastjson2.JSON;
import com.pazl.iot.admin.bean.UserStatus;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
public class EnumUtils {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
System.out.println("1.======================================================================================================");
Integer code = UserStatus.Disabled.getCode();
System.out.println(code);
String description = UserStatus.Disabled.getDescription();
System.out.println(description);
String name = UserStatus.Disabled.name();
System.out.println(name);
int ordinal = UserStatus.Disabled.ordinal();
System.out.println(ordinal);
Optional<Enum.EnumDesc<UserStatus>> userStatusEnumDesc = UserStatus.Disabled.describeConstable();
System.out.println(userStatusEnumDesc);
Class<UserStatus> declaringClass = UserStatus.Disabled.getDeclaringClass();
Class<? extends UserStatus> aClass = UserStatus.Disabled.getClass();
System.out.println(declaringClass == aClass);
System.out.println("2.======================================================================================================");
UserStatus locked = UserStatus.Locked;
System.out.println(locked);
UserStatus normal = UserStatus.valueOf("Normal");
System.out.println(normal);
UserStatus delete = UserStatus.valueOf(UserStatus.class, "Delete");
System.out.println(delete);
UserStatus[] values = UserStatus.values();
System.out.println(Arrays.toString(values));
System.out.println("3.======================================================================================================");
String typeName = UserStatus.class.getTypeName();
System.out.println(typeName);
boolean anEnum = UserStatus.class.isEnum();
System.out.println(anEnum);
UserStatus[] enumConstants = UserStatus.class.getEnumConstants();
for (UserStatus enumConstant : enumConstants) {
System.out.println(enumConstant.getCode() + ":" + enumConstant.getDescription());
}
Field[] declaredFields = UserStatus.class.getDeclaredFields();
for (Field declaredField : declaredFields) {
System.out.println(declaredField);
}
System.out.println("4.======================================================================================================");
UserStatus normal_1 = Enum.valueOf(UserStatus.class, "Normal");
System.out.println(normal_1);
System.out.println("5.======================================================================================================");
UserStatus enumObject = getEnumObjectByCode(UserStatus.class, 3);
System.out.println(enumObject.getCode());
System.out.println(enumObject.getDescription());
UserStatus enumObject2 = getEnumObjectByDescription(UserStatus.class, "未认证");
System.out.println(enumObject2.getCode());
System.out.println(enumObject2.getDescription());
UserStatus enumObject3 = getEnumObject(UserStatus.class, "description", "未认证");
System.out.println(enumObject3.getCode());
System.out.println(enumObject3.getDescription());
UserStatus enumObject4 = getEnumObject(UserStatus.class, "code", 3);
System.out.println(enumObject4.getCode());
System.out.println(enumObject4.getDescription());
Map<String, String> enumMapWithStringKey = getEnumMapWithStringKey(UserStatus.class);
System.out.println(JSON.toJSONString(enumMapWithStringKey));
Map<String, String> enumMapWithStringKey2 = getEnumMapWithStringKey(UserStatus.Delete);
System.out.println(JSON.toJSONString(enumMapWithStringKey2));
Map<Integer, String> enumMapWithIntegerKey = getEnumMapWithIntegerKey(UserStatus.class);
System.out.println(JSON.toJSONString(enumMapWithIntegerKey));
Map<Integer, String> enumMapWithIntegerKey2 = getEnumMapWithIntegerKey(UserStatus.Delete);
System.out.println(JSON.toJSONString(enumMapWithIntegerKey2));
}
public static <T extends Enum<T>> T getEnumObject(Class<T> enumClass, String integerFieldName, Integer integerFieldValue) throws NoSuchFieldException, IllegalAccessException {
Field integerField = enumClass.getDeclaredField(integerFieldName);
integerField.setAccessible(true);
T[] enumConstants = enumClass.getEnumConstants();
for (T enumConstant : enumConstants) {
Integer value = (Integer) integerField.get(enumConstant);
if (integerFieldValue.equals(value)) {
return enumConstant;
}
}
return null;
}
public static <T extends Enum<T>> T getEnumObject(Class<T> enumClass, String stringFieldName, String stringFieldValue) throws NoSuchFieldException, IllegalAccessException {
Field stringField = enumClass.getDeclaredField(stringFieldName);
stringField.setAccessible(true);
T[] enumConstants = enumClass.getEnumConstants();
for (T enumConstant : enumConstants) {
String value = (String) stringField.get(enumConstant);
if (stringFieldValue.equals(value)) {
return enumConstant;
}
}
return null;
}
public static <T extends Enum<T>> T getEnumObjectByDescription(Class<T> enumClass, String description) throws NoSuchFieldException, IllegalAccessException {
Field descField = enumClass.getDeclaredField("description");
descField.setAccessible(true);
T[] enumConstants = enumClass.getEnumConstants();
for (T enumConstant : enumConstants) {
String descValue = (String) descField.get(enumConstant);
if (description.equals(descValue)) {
return enumConstant;
}
}
return null;
}
public static <T extends Enum<T>> T getEnumObjectByCode(Class<T> enumClass, Integer code) throws NoSuchFieldException, IllegalAccessException {
Field codeField = enumClass.getDeclaredField("code");
codeField.setAccessible(true);
T[] enumConstants = enumClass.getEnumConstants();
for (T enumConstant : enumConstants) {
Integer codeValue = (Integer) codeField.get(enumConstant);
if (code.equals(codeValue)) {
return enumConstant;
}
}
return null;
}
public static <T extends Enum<T>> Integer getCode(T enumObject) throws IllegalAccessException, NoSuchFieldException {
Field codeField = enumObject.getClass().getDeclaredField("code");
codeField.setAccessible(true);
return (Integer) codeField.get(enumObject);
}
public static <T extends Enum<T>> Integer getCode(T enumObject, String codeFieldName) throws IllegalAccessException, NoSuchFieldException {
Field codeField = enumObject.getClass().getDeclaredField(codeFieldName);
codeField.setAccessible(true);
return (Integer) codeField.get(enumObject);
}
public static <T extends Enum<T>> String getDescription(T enumObject) throws IllegalAccessException, NoSuchFieldException {
Field descriptionField = enumObject.getClass().getDeclaredField("description");
descriptionField.setAccessible(true);
return (String) descriptionField.get(enumObject);
}
public static <T extends Enum<T>> String getDescription(T enumObject, String descFieldName) throws IllegalAccessException, NoSuchFieldException {
Field descriptionField = enumObject.getClass().getDeclaredField(descFieldName);
descriptionField.setAccessible(true);
return (String) descriptionField.get(enumObject);
}
public static <T extends Enum<T>> Map<Integer, String> getEnumMapWithIntegerKey(Class<T> enumClass) throws NoSuchFieldException, IllegalAccessException {
Map<Integer, String> enumMap = new LinkedHashMap<>();
Field[] fields = enumClass.getDeclaredFields();
for (Field field : fields) {
if (field.isEnumConstant()) {
T enumValue = Enum.valueOf(enumClass, field.getName());
Integer code = getCode(enumValue);
String description = getDescription(enumValue);
enumMap.put(code, description);
}
}
return enumMap;
}
public static <T extends Enum<T>> Map<Integer, String> getEnumMapWithIntegerKey(T enumObject) throws NoSuchFieldException, IllegalAccessException {
Map<Integer, String> enumMap = new LinkedHashMap<>();
Field[] fields = enumObject.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isEnumConstant()) {
T enumValue = Enum.valueOf(enumObject.getDeclaringClass(), field.getName());
Integer code = getCode(enumValue);
String description = getDescription(enumValue);
enumMap.put(code, description);
}
}
return enumMap;
}
public static <T extends Enum<T>> Map<String, String> getEnumMapWithStringKey(Class<T> enumClass) throws NoSuchFieldException, IllegalAccessException {
Map<String, String> enumMap = new LinkedHashMap<>();
Field[] fields = enumClass.getDeclaredFields();
for (Field field : fields) {
if (field.isEnumConstant()) {
T enumValue = Enum.valueOf(enumClass, field.getName());
Integer code = getCode(enumValue);
String description = getDescription(enumValue);
enumMap.put(code.toString(), description);
}
}
return enumMap;
}
public static <T extends Enum<T>> Map<String, String> getEnumMapWithStringKey(T enumObject) throws NoSuchFieldException, IllegalAccessException {
Map<String, String> enumMap = new LinkedHashMap<>();
Field[] fields = enumObject.getClass().getDeclaredFields();
for (Field field : fields) {
if (field.isEnumConstant()) {
T enumValue = Enum.valueOf(enumObject.getDeclaringClass(), field.getName());
Integer code = getCode(enumValue);
String description = getDescription(enumValue);
enumMap.put(code.toString(), description);
}
}
return enumMap;
}
}