Tôi đồng ý với Michael Borgwardt và Jon Skeet rằng EnumSet
đáng xem. Tôi đã chọn EnumSet
qua các thao tác bitwise như bạn đã có, vì vậy tôi sẽ trình bày cách sử dụng EnumSet
.
Dường như
Character
bạn enum
(chúng ta hãy gọi nó CharEnum
từ giờ trở đi) CharEnum
đang được sử dụng như một trường bit, trong đó mỗi enum có một giá trị int chỉ với một chút thiết lập:
A = 00000000 00000000 00000000 00000001
B = 00000000 00000000 00000000 00000010
C = 00000000 00000000 00000000 00000100
D = 00000000 00000000 00000000 00001000
Điều này rất giống với những gì mà EnumSet
làm cho bạn; nó có một vector bit nội bộ tự động gán mỗi enum cho một bit trên long
. Như JavaDoc cho nó nói, "Hiệu suất không gian và thời gian của lớp này phải đủ tốt để cho phép sử dụng nó như là một sự thay thế an toàn, chất lượng cao cho các cờ bit" dựa trên int truyền thống. "
Đây là một ví dụ về cách sử dụng nó
public enum CharEnum {
A, B, C, D;
}
và sau đó
EnumSet<CharEnum> ch = /* from user */
if (ch.contains(CharEnum.A)) {
// some operation...
}
Không cần phải chỉ định bit bất cứ nơi nào, vì vậy nó là mã đơn giản hơn nhiều!
Cảnh báo: điều này chỉ hoạt động vì các giá trị enum trong ví dụ C# của bạn chỉ có một bit đặt mỗi. Nếu bạn có giá trị enum như sau:
E = 00011000 01110111 11100101 10000101
thì EnumSet
sẽ không phù hợp. Trong trường hợp đó, bạn nên xem xét một trong các câu trả lời khác ở đây.
Bạn nên thêm một số dấu ngoặc đơn ở đó: 'if ((ch.getMask() & CharEnum.A.getMask())> 0)' –
@True Soft: Cố định, cảm ơn. –