在项目中我们需要定义大量的枚举,每隔枚举都需要提供code和value的查询方法,每次都写显得太鸡肋,这个时候我们借助于面向接口编程的技术来横向抽取这一段公共代码,有助于我们规范代码,缩小代码量
枚举优化demo
1.最简单的枚举类,即只含code的枚举
/**
* @description: 最简单的枚举类,即只含code的枚举
* @author: Ding Yawu
* @create: 2021/2/20 15:42
*/
public interface CodeEnum<T> {
/**
* 获取枚举值
*
* @return 枚举值
*/
T getCode();
}
2.带有枚举值以及枚举名称的枚举接口 继承 CodeEnum接口
/**
* @description: 带有枚举值以及枚举名称的枚举接口
* @author: Ding Yawu
* @create: 2021/2/20 15:42
*/
public interface CodeMsgEnum<T> extends CodeEnum<T> {
/**
* 获取枚举名称
*
* @return 枚举名
*/
String getMsg();
}
3.工具类
/**
* @description: 枚举常用工具类
* @author: Ding Yawu
* @create: 2021/2/20 15:42
*/
public final class EnumUtils {
/**
* 判断枚举值是否存在于指定枚举数组中
*
* @param enums 枚举数组
* @param code 枚举值
* @return 是否存在
*/
public static <T> boolean isExist(CodeEnum<T>[] enums, T code) {
if (code == null) {
return false;
}
for (CodeEnum<T> e : enums) {
if (Objects.equals(e.getCode(), code)) {
return true;
}
}
return false;
}
/**
* 判断枚举值是否存与指定枚举类中
*
* @param enumClass 枚举类
* @param value 枚举值
* @param <E> 枚举类型
* @param <V> 值类型
* @return true:存在
*/
@SuppressWarnings("unchecked")
public static <E extends Enum<? extends CodeEnum<V>>, V> boolean isExist(Class<E> enumClass, V value) {
for (Enum<? extends CodeEnum<V>> e : enumClass.getEnumConstants()) {
if (((CodeEnum<V>) e).getCode().equals(value)) {
return true;
}
}
return false;
}
/**
* 根据枚举值获取其对应的名字
*
* @param enums 枚举列表
* @param code 枚举值
* @return 枚举名称
*/
public static <T> String getMsgByCode(CodeMsgEnum<T>[] enums, T code) {
if (code == null) {
return null;
}
for (CodeMsgEnum<T> e : enums) {
if (Objects.equals(e.getCode(), code)) {
return e.getMsg();
}
}
return null;
}
/**
* 根据枚举名称获取对应的枚举值
*
* @param enums 枚举列表
* @param msg 枚举名
* @return 枚举值
*/
public static <T> T getCodeByMsg(CodeMsgEnum<T>[] enums, String msg) {
if (StringUtils.isEmpty(msg)) {
return null;
}
for (CodeMsgEnum<T> e : enums) {
if (Objects.equals(e.getMsg(), msg)) {
return e.getCode();
}
}
return null;
}
/**
* 根据枚举值获取对应的枚举对象
*
* @param enums 枚举列表
* @return 枚举对象
*/
@SuppressWarnings("unchecked")
public static <E extends Enum<? extends CodeEnum<V>>, V> E getEnumByCode(E[] enums, V code) {
for (E e : enums) {
if (Objects.equals(((CodeEnum<V>) e).getCode(), code)){
return e;
}
}
return null;
}
/**
* 根据枚举值获取对应的枚举对象
*
* @param enumClass 枚举class
* @return 枚举对象
*/
public static <E extends Enum<? extends CodeEnum<V>>, V> E getEnumByCode(Class<E> enumClass, V code) {
return getEnumByCode(enumClass.getEnumConstants(), code);
}
}
4.测试类
如果想使用工具类获取code和msg, 自定义的枚举需要实现CodeMsgEnum 或者CodeEnum
/**
* @description: 枚举优化测试
* @author: Ding Yawu
* @create: 2021/2/20 15:42
*/
public class EnumUtilsTest {
enum IntMsgEnum implements CodeMsgEnum<Integer> {
INT1(1, "类型测试1"),
INT2(2, "类型测试2");
private final Integer code;
private final String msg;
IntMsgEnum(Integer value, String name) {
this.code = value;
this.msg = name;
}
@Override
public String getMsg() {
return this.msg;
}
@Override
public Integer getCode() {
return this.code;
}
}
public static void main(String[] args) {
System.out.println(EnumUtils.isExist(IntMsgEnum.values(), 2));
System.out.println(EnumUtils.getMsgByCode(IntMsgEnum.values(), 2));
System.out.println(EnumUtils.getCodeByMsg(IntMsgEnum.values(), "类型测试2"));
System.out.println(EnumUtils.getEnumByCode(IntMsgEnum.values(), 1));
}
}