2011-02-10 89 views
17

假設你有一個枚舉方向我可以用位或對Java枚舉

enum Direction{ 
    North,South,East West 
} 

我可以寫一個使用按位或者是比較多個枚舉

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

在那裏我會調用上面的方法方法爲

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

Java的枚舉是正常物體(W /特殊序列化),僅此而已; java中沒有重載操作符(ala C) - 因此'不'。 – bestsss 2011-02-10 17:07:58

+1

我不知道到底的`canGoDirection(方向Dir)的含義',但是如果你想要做一個檢查,不應該有一個與替代| ? – zardosht 2014-03-13 10:08:20

回答

19

不能使用按位或類似的。嘗試更多的東西是這樣的:

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

這樣調用:

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

對於小EnumSet的,它採用的是長和位掩碼。 ;) – 2011-02-10 19:18:08

2

不是直接的,但如果你添加一個原語(例如int)字段到你的EN嗯,你能過,或int值。

但是,結果值爲int(不能隱式轉換爲boolean,遠遠少於enum)。

也許你會使用EnumSet反而會更好。這對Java來說更具慣用性。

+0

確實。但是,當然,爲了做到這一點,OP需要將他的`enum`定義爲`North(1),South(2),East(4),West(8)`。 – 2011-02-10 17:01:23

8

,你正在尋找由EnumSet實現的功能。

你舉的例子可以煮到:

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

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