Могу ли я использовать побитовое ИЛИ для Java Enums
Предположим, что у вас есть указатель перечисления
enum Direction{
North,South,East West
}
Могу ли я написать метод, который использует поразрядные или для сравнения нескольких перечислений
public boolean canGoDirection(Direction dir){
return dir | Direction.North;
}
где я бы назвал вышеуказанный метод как
this.canGoDirection(Direction.South | Direction.North);
Ответы
Ответ 1
Вы не можете использовать поразрядное или подобное. Попробуйте еще что-нибудь подобное:
public boolean canGoDirection(Set<Direction> dirs){
return dirs.contains(Direction.North);
}
называется так:
this.canGoDirection(EnumSet.of(Direction.South,Direction.North));
Ответ 2
Функциональность, которую вы ищете, реализована EnumSet.
Ваш пример можно отварить до:
final static EnumSet<Direction> ALLOWED_DIRECTIONS =
EnumSet.of( Direction.North, Direction.South );
public boolean canGoDirection(Direction dir){
return ALLOWED_DIRECTIONS.contains( dir );
}
Ответ 3
Не напрямую, но если вы добавите в свое перечисление примитивное поле (например, int
), вы можете ИЛИ, что int
значение.
Однако результирующее значение имеет значение int
(которое не может быть неявно преобразовано в boolean
, а тем более обратно к enum
).
Вероятно, вам лучше использовать EnumSet
. Это гораздо более идиоматично для Java.