今天在開發的時候遇到一個判斷需求:判斷一個值是否屬於枚舉類。之前寫的話都是通過在if裏面寫上|| 或來連接 或者爲每個枚舉Enum寫一個遍歷判斷的方法。後來想了一下實在太麻煩了,加入枚舉類改變的話業務代碼的判斷也需要改變比較麻煩,工具類也沒找到相關的,於是自己通過反射寫了一個循環遍歷判斷枚舉類。
首先,是一個枚舉類:
public enum AuditState {
TO_BE_AUDIT(0, "待審覈"),
AUDITED(1, "已審覈");
private String message;
private Integer code;
AuditState(Integer code, String message) {
this.message = message;
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
}
然後是一個EnumUtil類:
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* @author wayleung
* @description 枚舉工具類
* @date 2020-06-08
*/
public class EnumUtils {
/**
* 判斷數值是否屬於枚舉類的值
* @param clzz 枚舉類 Enum
* @param code
* @author wayleung
* @return
*/
public static boolean isInclude(Class<?> clzz,Integer code) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
boolean include = false;
if(clzz.isEnum()){
Object[] enumConstants = clzz.getEnumConstants();
Method getCode = clzz.getMethod("getCode");
for (Object enumConstant:enumConstants){
if (getCode.invoke(enumConstant).equals(code)) {
include = true;
break;
}
}
}
return include;
}
public static void main(String[] args) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException {
System.out.println(isInclude(BusinessGroupBuyEnum.AuditState.class,0));
System.out.println(isInclude(BusinessGroupBuyEnum.AuditState.class,1));
System.out.println(isInclude(BusinessGroupBuyEnum.AuditState.class,-1));
System.out.println(isInclude(BusinessGroupBuyEnum.AuditState.class,null));
}
}
返回的結果是:
true
true
false
false
通過測試!