2011-02-10 14 views
17

Suponga que tiene un sentido de enumeración¿Puedo usar OR bit a bit para enumeraciones de Java

enum Direction{ 
    North,South,East West 
} 

¿Podría escribir un método que utiliza bit a bit o es comparar varios enumeraciones

public boolean canGoDirection(Direction dir){ 
    return dir | Direction.North; 
} 

dónde iba a llamar a la anterior método que

this.canGoDirection(Direction.South | Direction.North); 
+1

enumeraciones de Java son objetos normales (w/serialización especial), eso es todo; no hay operadores sobrecargados (ala C) en java, por lo tanto 'no'. – bestsss

+1

No sé exactamente el significado de 'canGoDirection (Direction dir)', pero si quiere hacer una comprobación, ¿no debería haber un & en lugar de | ? – zardosht

Respuesta

19

No se puede usar en modo bit o eso. Probar algo de la misma familia:

public boolean canGoDirection(Set<Direction> dirs){ 
    return dirs.contains(Direction.North); 
} 

llamada así:

this.canGoDirection(EnumSet.of(Direction.South,Direction.North)); 
+1

Para EnumSet pequeños, usa una máscara larga y otra de poco. ;) –

2

No directamente, pero si se agrega un campo primitiva (por ejemplo int) a su baño um, puede O ese valor int.

Sin embargo, el valor resultante es de int (que no se puede convertir implícitamente a boolean, mucho menos a enum).

Probablemente sería mejor usar un EnumSet en su lugar. Esto es mucho más idiomático para Java.

+0

De hecho. Pero, por supuesto, para que esto tenga algún sentido, el OP necesitaría definir su 'enum' como algo como' Norte (1), Sur (2), Este (4), Oeste (8) '. –

8

La funcionalidad que usted está buscando es implementado por EnumSet.

Su ejemplo se puede hervir a:

final static EnumSet<Direction> ALLOWED_DIRECTIONS = 
    EnumSet.of(Direction.North, Direction.South); 

public boolean canGoDirection(Direction dir){ 
    return ALLOWED_DIRECTIONS.contains(dir); 
} 
+0

Muchas gracias. Eso fue muy útil para mí;) –