繁体   English   中英

为验证创建通用枚举包装器

[英]creating generic enum wrapper for validations

免责声明:generics 不是很强大。

enum WeekDays {
   SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
enum Months {
   JANUARY, FEBRAURY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER;
}
enum Directions {
   East, West, North, South, Up, Down
}

假设我有上面的枚举,并且有一个向我发送随机字符串的服务。

我需要验证目标字符串响应是否是有效的枚举值。

我正在考虑对以下行进行编码:

static <T> boolean isValidEnum(String value, T enumClass ){
   try {
       enumClass.valueOf(value);
       return true;
   } catch (Exception e) {
   }
   return false;
}

电话会是这样的:

isValidEnum("TUESDAY", WeekDays)

但是行enumClass.valueOf(value); 对我的 function 不满意。

任何指针表示赞赏! TIA

您可以将其重写为:

static <T extends Enum<T>> boolean isValidEnum(String value, Class<T> enumClass ){
    try {
        Enum.valueOf(enumClass, value);
        return true;
    } catch (Exception e) {
    }
    return false;
}

isValidEnum("TUESDAY", WeekDays.class)

您需要迭代枚举值并检查是否与传递的值匹配:

对于Java 8和更新版本:

static <T> boolean isValidEnum(String value, T enumClass ){
    return Arrays.stream(((Class) enumClass).getEnumConstants())
            .anyMatch(v -> v.toString().equals(value));
}

对于较旧的 Java版本:

static <T> boolean isValidEnum(String value, T enumClass ){
    for (Object v : ((Class) enumClass).getEnumConstants()){
        if (v.toString().equals(value)) return true;
    }
    return false;
}

有一个库,你也可以使用它,以防你不想实现它。

org.apache.commons.lang3org.apache.commons.lang3

EnumUtils.isValidEnum(WeekDays.class, "TUESDAY")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM