Java дней недели расчета - PullRequest
       16

Java дней недели расчета

2 голосов
/ 17 марта 2010

У меня есть Enum для дней недели (с ежедневным, выходным и рабочим днем), где каждая запись имеет значение типа 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;
  }
}

Учитывая ИТОГО любой комбинации значений, что было бы самым простым способом вычислить все отдельные значения и сделать из них массив данных. Например, учитывая число 56 (т.е. ср. + Четверг. Пт.), Как рассчитать дни.

Ответы [ 2 ]

6 голосов
/ 17 марта 2010

Правильный способ представления коллекции перечислимых значений - использовать EnumSet.Это использует битовый вектор внутри.Но показывать такие детали реализации, как в вашем коде, не очень хорошая идея.Мы делаем ОО здесь, а не немного.

Кроме того, вы смешиваете понятия одного значения и набора значений, что, вероятно, приведет к головным болям в будущем.

Пример с использованием DayOfWeek enum, встроенный в Java 8 и более поздние версии.

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

Boolean isTodayWeekend = weekend.contains( LocalDate.now().getDayOfWeek() );
4 голосов
/ 17 марта 2010

Как и предлагал Майкл, не раскрывайте детали реализации для внешнего мира. Создайте статический метод, который преобразует битовую маску 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.

...