有时候需要根据实际情况将某个值解释成一个枚举,而不是根据枚举的名称。如有时0是枚举Gender.MALE的值,1是枚举Gender.FEMALE的值;有时0、1又可以是另一个枚举的值,比如0表示CertType.IDENTITY_CARD,1表示CertType.PASSPORT。特别是查询数据库转换成枚举时。用if-else当然可以实现转换,但有一种通用的实现方法,如下:
1、定义一个枚举基础接口,所有的枚举都实现这个方法
public interface EnumBase { Object getValue(); }
2、定义一个具体枚举
public enum AccountType implements EnumBase { /** * 公司账户 */ COMPANY(1), /** * 个人账户 */ INDIVIDUAL(2); private Integer value; private AccountType(Integer value) { this.value = value; } @Override public Integer getValue() { return value; } }
3、实现通用的枚举解释方法
public class EnumParser { public static Object parse(Class<?> typeClass, Object value) { Class<? extends Enum> enumTmp = typeClass.asSubclass(Enum.class); Object[] constants = enumTmp.getEnumConstants(); int size = constants.length; for (int i = 0; i < size; i++) { Object tmp = constants[i]; String val = String.valueOf(((EnumBase) tmp).getValue()); if (val.equals(String.valueOf(value))) { return tmp; } } return null; } }
4、调用示例
AccountType enumTest = (AccountType) EnumParser.parse(AccountType.class, 1);
最终enumTest得到的就是
AccountType.COMPANY