我有一个星期几的枚举(每天,周末和工作日)如下,其中每个条目都有一个int值。
public enum DaysOfWeek {
Everyday(127),
Weekend(65),
Weekdays(62),
Monday(2),
Tuesday(4),
Wednesday(8),
Thursday(16),
Friday(32),
Saturday(64),
Sunday(1);
private int bitValue;
private DaysOfWeek(int n){
this.bitValue = n;
}
public int getBitValue(){
return this.bitValue;
}
}
给定值的任意组合的总计,计算所有单个值并从中生成一个arraylist的最简单方法是什么。例如,给定数字56(即Wed + Thur + Fri),如何计算天数。
答案 0 :(得分:6)
表示枚举值集合的正确方法是使用EnumSet
。这在内部使用位向量。但是在代码中暴露这样的实现细节并不是一个好主意。我们在这里做OO,而不是苦苦挣扎。
此外,您正在混合单个值和值集合的概念,这可能会导致头痛。
使用Java 8及更高版本中内置的DayOfWeek
枚举的示例。
EnumSet<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );
Boolean isTodayWeekend = weekend.contains( LocalDate.now().getDayOfWeek() );
答案 1 :(得分:4)
正如迈克尔建议的那样,不要将此实施细节暴露给外界。 创建一个将int位掩码转换为EnumSet的静态方法:
public static EnumSet< DaysOfWeek > fromBitValues (
final int origBitMask
)
{
final EnumSet< DaysOfWeek > ret_val =
EnumSet.noneOf( DaysOfWeek.class );
int bitMask = origBitMask;
for ( final DaysOfWeek val : DaysOfWeek.values( ) )
{
if ( ( val.bitValue & bitMask ) == val.bitValue )
{
bitMask &= ~val.bitValue;
ret_val.add( val );
}
}
if ( bitMask != 0 )
{
throw
new IllegalArgumentException(
String.format(
"Bit mask value 0x%X(%d) has unsupported bits " +
"0x%X. Extracted values: %s",
origBitMask,
origBitMask,
bitMask,
ret_val
)
);
}
return ret_val;
}
您可能还需要一个将EnumSet转换为位掩码的静态方法,我将此练习留给读者。
另外,看着你的枚举,每天,周末和工作日都不属于那里。它们是您其他DaysOfWeek值的聚合,因此应定义为EnumSets。