package jef.tools.reflect; /** * 自己写的Enum工具,Guava的实现也看了,总觉他搞复杂了,0.3us~0.8us 的一次转换操作被他多搞出一个Optional对象来, * <p> * Guava: * <code>Item i=Enums.getIfPresent(Item.class, "HTTP_TIMEOUT").orNull();</code> * Consume 962ns * <p> * EF: * <code>Item i=jef.tools.Enums.valueOf(Item.class, "HTTP_TIMEOUT", null);</code> * Consume 321ns * <p> * 感觉Guava为了让编程符合自然语言习惯已经有点走火入魔了。 * @author jiyi * */ public final class Enums { private Enums(){} /** * get the enum value. or return the defaultValue if absent. * @param <T> * @param clz * @param value * @param defaultValue * @return the enum value. or return the defaultValue if absent. */ public static <T extends Enum<T>> T valueOf(Class<T> clz,String value,T defaultValue){ try{ return Enum.valueOf(clz, value); }catch(IllegalArgumentException e){ return defaultValue; } } /** * get the enum value. or throw exception if the name not exist. * @param <T> * @param clz * @param value * @param exceptionMessage 异常消息模板,用 %s来标记传入的value * @return */ public static <T extends Enum<T>> T valueOf(Class<T> clz,String value,String exceptionMessage,Object... params){ try{ return Enum.valueOf(clz, value); }catch(IllegalArgumentException e){ throw new IllegalArgumentException(String.format(exceptionMessage, params)); } } }