2

我有一个星期几的枚举(包括每天、周末和工作日),如下所示,其中每个条目都有一个 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;
  }
}

给定任何值组合的 TOTAL,计算所有单个值并从中创建数组列表的最简单方法是什么。例如给定数字 56(即 Wed+Thur+Fri),如何计算天数。

4

2 回答 2

6

表示枚举值集合的正确方法是使用EnumSet. 这在内部使用位向量。但是在您的代码中公开这样的实现细节并不是一个好主意。我们在这里做的是面向对象,而不是小题大做。

此外,您正在混合单个值和一组值的概念,这可能会导致令人头疼的问题。

DayOfWeek使用Java 8 及更高版本中内置的枚举的示例。

EnumSet<DayOfWeek> weekend = EnumSet.of( DayOfWeek.SATURDAY , DayOfWeek.SUNDAY );

Boolean isTodayWeekend = weekend.contains( LocalDate.now().getDayOfWeek() );
于 2010-03-17T11:41:10.287 回答
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 转换为位掩码的静态方法,我将这个练习留给读者。

此外,查看您的枚举,Everyday、Weekends 和 Weekdays 不属于那里。它们是其他 DaysOfWeek 值的聚合,因此应定义为 EnumSets。

于 2010-03-17T12:04:34.117 回答