目录
- 一. 遇到的问题
- 二. 解决策
- 2.1 定义让枚举类继承的接口
- 2.2 枚举类实现接口
- 2.3 获取枚举类各种数据的工具类
- 三. 效果
一. 遇到的问题
⏹项目中有可能需要根据code或者name来获取对应的枚举类,这时枚举类中往往需要添加fromCode
个fromName
这样的代码来进行处理。
如果项目中有多个枚举类的话,这样的通篇一律的代码就会增多,代码就会冗余。
public enum SexTypes {男性("1"),女性("2"),保密("3");private String code;SexTypes(String code) {this.code = code;}public String getCode() {return code;}// 根据code获取枚举类public static SexTypes fromCode(String code) {return Arrays.stream(SexTypes.values()).filter(item -> item.code.equals(code)).findAny().orElse(null);}// 根据name获取枚举类public static SexTypes fromName(String name) {return Arrays.stream(SexTypes.values()).filter(item -> item.name().equals(name)).findAny().orElse(null);}
}
二. 解决策
2.1 定义让枚举类继承的接口
- 枚举类中的code类型不确定,所以使用泛型更具有通用性
- name的类型一般就是字符串类型了
public interface IEnumNameValue<T> {T getCode();String getName();
}
2.2 枚举类实现接口
- 枚举类实现接口,指定code的数据类型
public enum GenderEnum implements IEnumNameValue<Integer> {MALE(1, "男"),FEMALE(0, "女");// 性别值private final Integer code;// 性别名private final String name;GenderEnum(Integer code, String name) {this.code = code;this.name = name;}@Overridepublic Integer getCode() {return code;}@Overridepublic String getName() {return name;}
}
2.3 获取枚举类各种数据的工具类
- 工具类只能处理实现了
IEnumNameValue
自定义接口的枚举类 - 可以根据code和name来获取对应的枚举类
- 可以根据判断code对应的枚举类是否存在
- 可以获取code和name的List
- 可以获取code和name的Map
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;@SuppressWarnings("unchecked")
public final class EnumUtils {public enum CHECK{NG,OK}// 根据code获取枚举对象public static <E extends Enum<? extends IEnumNameValue<V>>, V> E getEnumByCode(E[] enums, V code) {return Arrays.stream(enums).filter(e -> ((IEnumNameValue<V>)e).getCode().equals(code)).findAny().orElse(null);}public static <E extends Enum<? extends IEnumNameValue<V>>, V> E getEnumByCode(Class<E> enumClass, V code) {return EnumUtils.getEnumByCode(enumClass.getEnumConstants(), code);}// 根据名称获取枚举类对象public static <E extends Enum<? extends IEnumNameValue<V>>, V> E getEnumByName(E[] enums, String name) {return Arrays.stream(enums).filter(e -> ((IEnumNameValue<V>)e).getName().equals(name)).findAny().orElse(null);}public static <E extends Enum<? extends IEnumNameValue<V>>, V> E getEnumByName(Class<E> enumClass, String name) {return EnumUtils.getEnumByName(enumClass.getEnumConstants(), name);}// 获取值数组public static <E extends Enum<? extends IEnumNameValue<V>>, V> List<V> getCodeList(Class<E> enumClass) {return Arrays.stream(enumClass.getEnumConstants()).map(e -> ((IEnumNameValue<V>) e).getCode()).collect(Collectors.toList());}// 获取名称数组public static <E extends Enum<? extends IEnumNameValue<V>>, V> List<String> getNameList(Class<E> enumClass) {return Arrays.stream(enumClass.getEnumConstants()).map(e -> ((IEnumNameValue<V>) e).getName()).collect(Collectors.toList());}// 获取值 -> 名称 的 Mappublic static <E extends Enum<? extends IEnumNameValue<V>>, V> Map<V, String> getCodeNameMap(Class<E> enumClass) {return Arrays.stream(enumClass.getEnumConstants()).collect(Collectors.toMap(e -> ((IEnumNameValue<V>) e).getCode(),e -> ((IEnumNameValue<V>) e).getName()));}// 获取名称 -> 值 的 Mappublic static <E extends Enum<? extends IEnumNameValue<V>>, V> Map<String, V> getNameCodeMap(Class<E> enumClass) {return Arrays.stream(enumClass.getEnumConstants()).collect(Collectors.toMap(e -> ((IEnumNameValue<V>) e).getName(),e -> ((IEnumNameValue<V>) e).getCode()));}// 校验code所对应的枚举值知否存在public static <E extends Enum<? extends IEnumNameValue<V>>, V> CHECK isExist(Class<E> enumClass, V code) {for (E e : enumClass.getEnumConstants()) {if (((IEnumNameValue<V>) e).getCode().equals(code)) {return CHECK.OK;}}return CHECK.NG;}
}