Zgadzam się z Michaelem Borgwardtem i Jonem Skeetem, że warto przyjrzeć się EnumSet
. Wybrałbym EnumSet
w bitowych operacjach, jak to masz, więc pokażę, jak używać EnumSet
.
To wygląda jak
Character
wyliczenia
(nazwijmy go CharEnum
od teraz) CharEnum
jest używany jak pole bitowe, gdzie każdy enum ma wartość int z tylko jednym bitem:
A = 00000000 00000000 00000000 00000001
B = 00000000 00000000 00000000 00000010
C = 00000000 00000000 00000000 00000100
D = 00000000 00000000 00000000 00001000
Jest to bardzo podobne do tego, co robi dla ciebie EnumSet
; ma wewnętrzny wektor bitowy, który automatycznie przypisuje każde wyliczenie do bitu na long
. Jak mówi JavaDoc, "Wydajność w czasie i przestrzeni tej klasy powinna być wystarczająco dobra, aby umożliwić jej użycie jako wysokiej jakości, bezpiecznej dla zdrowia alternatywy dla tradycyjnych" bitowych flag "opartych na int."
Oto przykładem tego, jak go używać
public enum CharEnum {
A, B, C, D;
}
a następnie
EnumSet<CharEnum> ch = /* from user */
if (ch.contains(CharEnum.A)) {
// some operation...
}
nie ma potrzeby, aby określić bity wszędzie, więc jest to znacznie prostsze kod!
Ostrzeżenie: działa to tylko dlatego, że wartości wyliczeniowe w przykładzie C# mają tylko jeden bit ustawiony. Jeśli miał wartość enum tak:
E = 00011000 01110111 11100101 10000101
wtedy EnumSet
nie byłoby właściwe. W takim przypadku powinieneś spojrzeć na jedną z pozostałych odpowiedzi tutaj.
Powinieneś dodać kilka nawiasów: 'if ((ch.getMask() i CharEnum.A.getMask())> 0)' –
@ True: Fixed, thanks. –