Marcus Leon Marcus Leon - 6 months ago 23
Java Question

Best practice to look up Java Enum

We have a REST API where clients can supply parameters representing values defined on the server in Java Enums.

So we can provide a descriptive error, we add this

lookup
method to each Enum. Seems like we're just copying code (bad). Is there a better practice?

public enum MyEnum {
A, B, C, D;

public static MyEnum lookup(String id) {
try {
return MyEnum.valueOf(id);
} catch (IllegalArgumentException e) {
throw new RuntimeException("Invalid value for my enum blah blah: " + id);
}
}
}


Update: The default error message provided by
valueOf(..)
would be
No enum const class a.b.c.MyEnum.BadValue
. I would like to provide a more descriptive error from the API.

Answer

Probably you can implement generic static lookup method.

Like so

public class LookupUtil {
   public static <E extends Enum<E>> E lookup(Class<E> e, String id) {   
      try {          
         E result = Enum.valueOf(e, id);
      } catch (IllegalArgumentException e) {
         // log error or something here

         throw new RuntimeException(
           "Invalid value for enum " + e.getSimpleName() + ": " + id);
      }

      return result;
   }
}

Then you can

public enum MyEnum {
   static public MyEnum lookup(String id) {
       return LookupUtil.lookup(MyEnum.class, id);
   }
}

or call explicitly utility class lookup method.