我有一个public enum DayType {
REGULAR(1), VACATION(2), SICK(3);
private final int value;
private DayType(int value)
{
this.value = value;
}
public int getValue() {
return value;
}
}
值的枚举用于存储在DB中:
private DayType dayType
public void setDayType(int dayType) {
switch(dayType) {
case 1:
this.dayType = DayType.REGULAR;
break;
case 2:
this.dayType = DayType.VACATION;
break;
case 3:
this.dayType = DayType.SICK;
break;
default :
this.dayType = DayType.REGULAR;
break;
}
这是这个枚举的设定者:
int
一切正常。但是,如果每个枚举值都有{{1}}值,则必须有更“漂亮”的方式来编写setter。不使用开关盒......
答案 0 :(得分:2)
在这种特殊情况下,您不需要为每个元素显式指定int值,只需将其常量视为数组:
private DayType dayType = DayType.REGULAR;
public void setDayType(int dayType) {
if (dayType <= DayType.values().length) this.dayType = DayType.values()[dayType - 1];
}
答案 1 :(得分:1)
通常的方法是在枚举
中添加静态方法public enum DayType {
REGULAR(1), VACATION(2), SICK(3);
private final int value;
private DayType(int value)
{
this.value = value;
}
public int getValue() {
return value;
}
public static DayType byValue(int value) {
Arrays.stream(DayType.values())
.filter(dt -> dt.value == value)
.findFirst()
.orElse(DayType.REGULAR);
}
}
用法
private DayType dayType
public void setDayType(int dayType) {
this.dayType = DayType.byValue(dayType);
}
答案 2 :(得分:0)
您可以使用.ordinal()和值[index]的值来获取值。
不是在枚举中包含值字段,而是存储其DayType.REGULAR.ordinal()值。
所以加载:
this.dayTipe = DayType.values[dayType];
这里唯一的缺点是更新Enum,你需要在最后一个之后添加所有新的,所以它的索引永远不会冲突。
答案 3 :(得分:0)
您可以使用
避免使用switch语句public void setDayType(int type) {
for(DayType dayType : DayType.values()) {
if(dayType.getValue() == type) {
this.dayType = dayType;
}
}
}
如果您需要性能而不是内存,可以使用HashMap
:
private HashMap<Integer, DayType> dayTypes;
private void initDayTypes() {
for(DayType type : DayType.values()) {
dayTypes.put(type.value, type);
}
}
用法将是下一个:
public void setDayType(int type) {
this.dayType = dayTypes.get(type);
}