有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

免责声明:泛型不是很强

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);行对我的函数不满意

任何指点都很感激!短暂性脑缺血发作


共 (3) 个答案

  1. # 1 楼答案

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

    使用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;
    }
    
  2. # 2 楼答案

    您可以将其改写为:

    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)
    
  3. # 3 楼答案

    这有一个库,如果您不想实现它,也可以使用它

    {}中的{a1}

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