Java周计算

时间:2010-03-17 11:34:15

标签: java enums days

我有一个星期几的枚举(每天,周末和工作日)如下,其中每个条目都有一个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),如何计算天数。

2 个答案:

答案 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。