Pregunta

Tengo una enumeración de los días de la semana (con todos los días, fines de semana y días de la semana) de la siguiente manera que cada entrada tiene un valor 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;
  }
}

dado un total de cualquier combinación de los valores, ¿cuál sería la forma más sencilla de calcular todos los valores individuales y crea un ArrayList de ella. Por ejemplo, dado el número 56 (es decir Mier + jue. + vie), la forma de calcular los días.

¿Fue útil?

Solución

Como Michael sugirió no exponga este detalle de implementación con el mundo exterior. Crear un método estático que convierte a int máscara de bits 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;
}

También puede ser necesario un método estático que convierte una EnumSet a una máscara de bits, les dejo este ejercicio para el lector.

Además, mirando a su enumeración, Todos los días, fines de semana y días de semana no deberían estar allí. Ellos son agregados de otros valores DaysOfWeek y como tales deben ser definidos como EnumSets.

Otros consejos

La forma correcta para representar una colección de valores de enumeración es usar un EnumSet . Este sistema utiliza un vector de bits internamente. Sin embargo, la exposición de un detalle de dicha aplicación como en su código no es una buena idea. Que estamos haciendo aquí OO, no de bits haciendo girar.

Además, usted está mezclando los conceptos de un solo valor y un conjunto de valores, lo que probablemente dará lugar a dolores de cabeza en el futuro.

Ejemplo usando el DayOfWeek enum incorporado en Java 8 y versiones posteriores.

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

Boolean isTodayWeekend = weekend.contains( LocalDate.now().getDayOfWeek() );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top