这就是我想要做的。我有一个每周包含多天的字段。 (例如,它可以存储星期一或星期一|星期二,或星期三|星期五) - 基本上任何组合。
为此,我使用了权力为2的枚举,如下所示:
public enum DayOfWeek {
Monday(1),
Tuesday(2),
Wednesday(4),
Thursday(8),
Friday(16),
Saturday(32),
Sunday(64);
private final int index;
DayOfWeek(int index) {
this.index = index;
}
public int value() {
return index;
}
}
然后我在数据库中存储一个整数,如下所示:
DayOfWeek days = DayOfWeek.Monday | DayOfWeek.Thursday; // Monday and Thursday
int daysAsInt = (DayOfWeek)days; // Value to save
我可以测试这样的日子
if ((days & DayOfWeek.Monday) == DayOfWeek.Monday) /* If days contains Monday */
我的问题是我不确定如何将整数值转换回DayOfWeek。我以为我可以施展它(DayOfWeek)daysAsInt
。但它不起作用。
非常感谢任何建议。
答案 0 :(得分:7)
您的枚举属于个人天的日期 - 类型DayOfWeek
的变量应该只能指代一天。如果您尝试存储多个值,则应查看EnumSet
:
EnumSet<DayOfWeek> days = EnumSet.of(DayOfWeek.Monday, DayOfWeek.Wednesday);
int valueToStore = setToValue(days);
随后:
int valueRetrieved = ...;
EnumSet<DayOfWeek> days = valueToSet(days);
这些方法声明为:
static int setToValue(EnumSet<DayOfWeek> days) {
int value = 0;
for (DayOfWeek day : days) {
value |= day.value();
}
return value;
}
static int valueToSet(int value) {
EnumSet<DayOfWeek> days = EnumSet.noneOf(EnumSet.class);
for (DayOfWeek day : EnumSet.allOf(EnumSet.class)) {
if ((value & day.value()) != 0) {
days.add(day);
}
}
return days;
}
答案 1 :(得分:0)
由于整数可能包含多天,因此您不能简单地将整数转换回单个DayOfWeek
实例,而是必须返回DayOfWeek
元素的数组/集/列表。
要做到这一点,你可以在DayOfWeek
中提供一个静态方法,并检查每个“索引”的int(这不是一个索引,而是一个标志/ id)。