creating generic enum wrapper for validations

Viewed 194

Disclaimer: not very strong with 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
}

Let's say I have above enums and there is a service which sends me random Strings.

I need to verify if the targeted String response is a valid enum value or not.

I was thinking of coding of something on lines as below:

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

The call would be like:

isValidEnum("TUESDAY", WeekDays)

but line enumClass.valueOf(value); is not happy about my function.

Any pointers is appreciated! TIA

3 Answers

You can rewrite it to this:

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

and

isValidEnum("TUESDAY", WeekDays.class)

You need to iterate the Enum values and check if there is a match with the value passed:

With Java 8 and newer versions:

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

With older Java versions:

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

There is a library for this, you can also use that in case you don't want to implement it.

EnumUtils of org.apache.commons.lang3

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