我可以为Java Enums使用按位或运算符吗?

17

假设您有一个枚举类型Direction

enum Direction{
    North,South,East West
}

我能否编写一个方法,使用按位或运算符来比较多个枚举值?

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

我将在以下位置调用上述方法:

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

1
Java中的枚举是普通对象(带有特殊序列化),仅此而已;在Java中没有重载运算符(类似于C)-因此“没有”。 - bestsss
1
我不确定 canGoDirection(Direction dir) 的意思,但如果你想要进行检查,应该使用 & 而不是 | 吧? - zardosht
3个回答

20

你不能像那样使用按位或运算符。尝试像这样做:

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

这样调用:

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

1
对于小的EnumSet,它使用一个长整型和一个位掩码。 ;) - Peter Lawrey

9
您所需要的功能可以通过EnumSet实现。
您的示例可以简化为:
final static EnumSet<Direction> ALLOWED_DIRECTIONS =
    EnumSet.of( Direction.North, Direction.South );

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

2

虽然不能直接实现,但是如果您给枚举类型添加一个基本类型(例如int)字段,您可以对该int值进行按位或运算。

然而,结果值是int类型的(它不能隐式转换为boolean类型,更不用说转换回enum类型了)。

也许使用EnumSet会更好。这更符合Java语言的惯用法。


确实。但是当然,为了让这有任何意义,OP需要将他的enum定义为类似于North(1),South(2),East(4),West(8)这样的东西。 - Oliver Charlesworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接