2011-02-10 34 views
17

Giả sử bạn có một Direction enumTôi có thể sử dụng bitwise OR cho Java Enums

enum Direction{ 
    North,South,East West 
} 

Tôi có thể viết một phương pháp có sử dụng Bitwise hoặc là để so sánh nhiều enums

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

nơi tôi sẽ gọi trên phương thức như

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

enums java là những đối tượng bình thường (w/serialization đặc biệt), đó là tất cả; không có toán tử quá tải (ala C) trong java - do đó 'không'. – bestsss

+1

Tôi không biết chính xác ý nghĩa của 'canGoDirection (Hướng dir)', nhưng nếu bạn muốn làm một kiểm tra, không nên có một & thay vì | ? – zardosht

Trả lời

19

Bạn không thể sử dụng bitwise hoặc tương tự. Hãy thử một cái gì đó như thế này:

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

gọi là như thế này:

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

Đối với EnumSet nhỏ, nó sử dụng một mặt nạ dài và một chút. ;) –

2

Không trực tiếp, nhưng nếu bạn thêm trường gốc (ví dụ int) vào um, bạn có thể HOẶC giá trị int.

Tuy nhiên, giá trị kết quả là int (không thể chuyển đổi hoàn toàn thành boolean, ít hơn nhiều so với enum).

Có thể bạn nên sử dụng số EnumSet thay thế. Điều này là thành ngữ hơn nhiều với Java.

+0

Thật vậy. Nhưng tất nhiên, để điều này có ý nghĩa gì, OP sẽ cần phải xác định 'enum' của anh ta như một cái gì đó như 'North (1), South (2), East (4), West (8)'. –

8

Các chức năng mà bạn đang tìm kiếm được thực hiện bởi EnumSet.

ví dụ bạn có thể được luộc để:

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

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

Cảm ơn rất nhiều. Điều đó rất hữu ích cho tôi;) –

Các vấn đề liên quan