【问题标题】:creating generic enum wrapper for validations为验证创建通用枚举包装器
【发布时间】:2020-05-12 09:54:57
【问题描述】:

免责声明:泛型不是很强大。

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); 行对我的功能不满意。

任何指针表示赞赏! TIA

【问题讨论】:

    标签: java generics types enums instance


    【解决方案1】:

    你可以改写成这样:

    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)
    

    【讨论】:

    • 简洁优雅,完全错过了Enum实用程序!
    • 简单,但不优雅:每次值无效时都会抛出异常
    • @AndreaLigios:恕我直言,如果有意识地提出例外情况有时比采取漫长的迭代路径更好,但话又说回来,个人意见各不相同!
    【解决方案2】:

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

    使用 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;
    }
    

    【讨论】:

      【解决方案3】:

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

      EnumUtilsorg.apache.commons.lang3

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

      【讨论】:

      • isValidEnum 在内部也做了我想做的事情,兴趣是了解幕后的事情!
      • @NoobEditor 是的,我不明白,我只是想让你知道图书馆。
      猜你喜欢
      • 1970-01-01
      • 2019-06-21
      • 2022-08-03
      • 2017-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2010-09-06
      相关资源
      最近更新 更多