最近常常有一些项目需要给枚举设值一个int值,以及对int值进行反解析出枚举类型,代码如下:
1 public enum MatchResultEnum { 2 3 /** 4 * 赢 5 */ 6 WIN(0), 7 /** 8 * 输 9 */ 10 LOSE(1), 11 /** 12 * 平局 13 */ 14 DRAW(2); 15 16 /** 17 * 比赛结果的code值 18 */ 19 private int code; 20 21 MatchResultEnum(int value) { 22 this.code = value; 23 } 24 25 public int getCode() { 26 return code; 27 } 28 29 30 public static MatchResultEnum parse(int value) { 31 MatchResultEnum[] values = values(); 32 for (MatchResultEnum matchResult : values) { 33 if (matchResult.code == value) { 34 return matchResult; 35 } 36 } 37 return null; 38 } 39 }
后期优化如下:
1 private static MatchResultEnum[] result = {WIN, LOSE, DRAW}; 2 public static MatchResultEnum parse(int value) { 3 if (value < result.length) { 4 return result[value]; 5 } 6 return null; 7 } 8 9 //替换原代码:30-38行 ,原因数组更加高效。但是这种用法有取巧的做法,前提是code值刚好是从0开始顺序递增的
另外一种方法:(前提是每个枚举的code值是唯一的)
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* 告警类型
* 目前支持邮件告警和,短信告警
*/
public enum AlarmTypeEnum {
/**
* 短信告警
*/
SMS((short) 1),
/**
* 邮件告警
*/
EMAIL((short) 2);
/**
* 数据库中存储的码号,号码不能重复
*/
private short code;
private static Map<Short, AlarmTypeEnum> alarmTypes;
static {
alarmTypes = new HashMap<>();
AlarmTypeEnum[] values = AlarmTypeEnum.values();
Arrays.stream(values).forEach(alarmTypeEnum -> alarmTypes.put(alarmTypeEnum.getCode(), alarmTypeEnum));
}
AlarmTypeEnum(short code) {
this.code = code;
}
public short getCode() {
return code;
}
public static AlarmTypeEnum parseCode(short code) {
return alarmTypes.get(code);
}
public static void main(String[] args) {
System.out.println(AlarmTypeEnum.parseCode((short) 2));
}
}
浙公网安备 33010602011771号