Я согласен с Майклом Боргвардтом и Джоном Скитом в том, что стоит посмотреть EnumSet
. Я бы выбрал EnumSet
для побитовых операций, как у вас, поэтому я покажу, как использовать EnumSet
.
Похоже, что ваше Character
enum (теперь будем называть его CharEnum
) CharEnum
используется как битовое поле, где каждое перечисление имеет значение типа int только с одним битом комплект:
A = 00000000 00000000 00000000 00000001
B = 00000000 00000000 00000000 00000010
C = 00000000 00000000 00000000 00000100
D = 00000000 00000000 00000000 00001000
Это очень похоже на то, что EnumSet
делает для вас; у него есть внутренний битовый вектор, который автоматически присваивает каждому перечислению бит на long
. Как говорится в JavaDoc, «Пространственно-временные характеристики этого класса должны быть достаточно хорошими, чтобы его можно было использовать в качестве высококачественной, безопасной с точки зрения типов альтернативы традиционным« битовым флагам »на основе int. *
Вот пример того, как его использовать
public enum CharEnum {
A, B, C, D;
}
, а затем
EnumSet<CharEnum> ch = /* from user */
if (ch.contains(CharEnum.A)) {
// some operation...
}
Не нужно нигде указывать биты, поэтому код намного проще!
Предупреждение: это работает только потому, что для значений перечисления в вашем примере на C # установлен только один бит. Если у вас было значение перечисления, подобное этому:
E = 00011000 01110111 11100101 10000101
тогда EnumSet
не будет уместным. В этом случае вы должны посмотреть на один из других ответов здесь.