一种根据value解释成枚举的有效方法

时间:2021-06-20 06:32:42

有时候需要根据实际情况将某个值解释成一个枚举,而不是根据枚举的名称。如有时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