应用场景:对于接口传入的枚举值,无法确定其合法性。基于编程的严谨性,最好对枚举值进行校验。
校验对象:
- 自定义枚举Code、type等
- 自定义枚举字段
举栗说明
测试枚举类:
package cn.itoak;
/**
* Project:CodeFragment
* FullPath:cn.itoak.ColorEnum
* Date:2019/9/20
* Time:14:42
* Description:颜色枚举
*
* @author itoak
* @version 1.0
*/
public enum ColorEnum {
WHITE(1, "白色"),
BLACK(2, "黑色"),
RED(3, "红色"),
YELLOW(4, "黄色"),
PURPLE(5, "紫色");
private Integer type;
private String desc;
ColorEnum(Integer type, String desc) {
this.type = type;
this.desc = desc;
}
//ignore getter and setter
}
校验枚举工具类(本文主角T.T)
package cn.itoak;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Objects;
/**
* Project:CodeFragment
* FullPath:cn.itoak.EnumUtil
* Date:2019/9/20
* Time:14:36
* Description:校验枚举合法性工具类
*
* @author itoak
* @version 1.0
*/
public class EnumUtil {
/**
* 检测字段值是否为枚举合法字段值
*
* @param targetField 待检测字段
* @param fieldValue 待检测字段值
* @param clazz 枚举类型Class
* @return 字段值是否合法
*/
@SuppressWarnings("unchecked")
public static <T> boolean validateFieldValue(String targetField, Object fieldValue, Class<T> clazz) {
if (clazz == null || !clazz.isEnum() || Objects.isNull(fieldValue) || StringUtils.isEmpty(targetField))
return false;
try {
Method method = clazz.getMethod("values");
T[] items = (T[]) method.invoke(null);
Field field = clazz.getDeclaredField(targetField);
field.setAccessible(true);
for (T t : items) {
Object obj = field.get(t);
if (obj.equals(fieldValue))
return true;
}
} catch (Exception ignored) {
}
return false;
}
/**
* 校验枚举字段是否合法
*
* @param targetField 枚举字段
* @param clazz 枚举类型Class
* @return 字段是否合法
*/
public static <T> boolean validateField(String targetField, Class<T> clazz) {
if (clazz == null || !clazz.isEnum() || StringUtils.isEmpty(targetField)) {
return false;
}
try {
Method method = clazz.getMethod("valueOf", String.class);
Object item = method.invoke(null, targetField);
if (Objects.nonNull(item))
return true;
} catch (Exception ignored) {
}
return false;
}
public static void main(String[] args) {
boolean expression1 = validateFieldValue("type", 0, ColorEnum.class);
System.out.println(expression1);//false
boolean expression2 = validateFieldValue("type", 1, ColorEnum.class);
System.out.println(expression2);//true;
boolean expression3 = validateField("REDD", ColorEnum.class);
System.out.println(expression3);//false
boolean expression4 = validateField("RED", ColorEnum.class);
System.out.println(expression4);//true
}
}