最近在写一个关于社交的项目,里面有非常多非常多的状态需要判断,就写了非常多的非常多的枚举,因为要根据很多状态值返回文字信息给前端,所以就不得不在每个枚举中都写一个根据code获取描述的方法,比方说这样
/**
* 添加类型枚举
*/
@Getter
public enum JoinTypeEnums {
DIRECT(0, "直接通过"),
AGREE(1, "同意后通过"),
;
private Integer code;
private String desc;
JoinTypeEnums(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
public int value() {
return this.code;
}
public static String getDesc(Integer code) {
for (JoinTypeEnums joinTypeEnums : JoinTypeEnums.values()) {
if (joinTypeEnums.getCode().equals(code)) {
return joinTypeEnums.getDesc();
}
}
return null;
}
}
写的写的我发现 这样做很累 就想可不可以写个通用的东西来操控枚举,本来想着写一个BaseEnum,结果发现枚举类根本没法继承,因为你定义的枚举有三个属性的,也有两个属性的,等等等,最后苦思冥想 写了一个枚举工具类 话不多说 直接上代码
首先你需要定义一个接口,里面有两个方法 一个是getCode 一个是getDesc 这个很关键 如果不写这个的话 你无法根据code来进行判断
public interface EnumCode {
Integer getCode();
String getDesc();
}
然后在你的项目中 把每一个枚举都实现这个接口 这样也省的你去写枚举的getter方法,比方说这样,这里你如果懒得重写的话,直接使用lombok的@Getter注解也可以达到 不会有任何编译错误
public enum ContactApplyEnum implements EnumCode {
PENDING(0, "待处理"),
APPROVED(1, "已通过"),
DENIED(2, "已拒绝"),
BLACKLISTED(3, "已拉黑");
private final Integer code;
private final String desc;
ContactApplyEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
@Override
public Integer getCode() {
return code;
}
@Override
public String getDesc() {
return desc;
}
}
最后就可以用啦 直接cv到你的项目就好
package com.fastfine.chat.util;
import com.fastfine.chat.common.constant.CommonConstant;
import com.fastfine.chat.common.enums.EnumCode;
import com.fastfine.chat.exception.BusinessException;
public class EnumUtil {
/**
* 根据code获取枚举描述
*/
public static <T extends Enum<T> & EnumCode> String getDescOfCode(Class<T> enumClass, Integer code) {
T[] enumConstants = enumClass.getEnumConstants();
if (enumConstants != null) {
for (T enumConstant : enumConstants) {
if (enumConstant.getCode() == code) {
return enumConstant.getDesc();
}
}
}
return CommonConstant.INVALID_CODE;//这里是一个字符串常量 自己定义就好
}
/**
* 判断是否为有效的code
*/
public static <T extends Enum<T> & EnumCode> boolean isNotValidCode(Class<T> enumClass, Integer code) {
String desc = getDescOfCode(enumClass, code);
return CommonConstant.INVALID_CODE.equals(desc);
}
/**
* 根据code获取枚举实例
*/
public static <T extends Enum<T> & EnumCode> T getEnumByCode(Class<T> enumClass, Integer code) {
T[] enumConstants = enumClass.getEnumConstants();
if (enumConstants != null) {
for (T enumConstant : enumConstants) {
if (enumConstant.getCode() == code) {
return enumConstant;
}
}
}
throw new BusinessException(500, "无法获取枚举实例,code不存在");
// return null;
}
}
接下来就是演示了 我定义了一个1 一个100 一个有效 一个无效
实际代码中的运用
// 如果code无效 或者还是待通过 提醒用户选择有效参数
if (EnumUtil.isNotValidCode(ContactApplyEnum.class,status) || Objects.equals(ContactApplyEnum.PENDING.code(), status)){
return R.error("请选择有效的参数!");
}