2013-02-25 8 views
1

Так что я конвертирую некоторые битовые поля в нашем приложении, чтобы использовать EnumSet вместо этого, и мне любопытно, есть ли лучший способ сделать сравнение для X | Y. В настоящее время мы делаем что-то вроде:Проверка для/или с EnumSet

if(bitfield & (X | Y) != 0) { 
    //do stuff 
} 

The EnumSet эквивалент кажется:

if(enumSet.contains(X) || enumSet.contains(Y)) { 
    //do stuff 
} 

Есть уборщик способ сделать это? Я знаю, что вы можете проверить containsAll() так:

EnumSet flagsToCheck = EnumSet.of(X, Y); 
if(enumSet.containsAll(flagsToCheck)) { 
    //do stuff 
} 

Но это для сценария, в котором вы хотите знать, если (X & Y) установлен. Есть ли эквивалентный способ проверки для (X | Y)? Я бы подумал, что будет что-то вроде метода containsAny(), но я не вижу ничего похожего на этот эффект.

ответ

6

Я бы сказал, что существующий подход еще читабельны, чем ваш побитовый подход. Он точно говорит о том, что вы имеете в виду: если набор содержит X, или набор содержит Y ... Держите его таким, какой он есть. Это уже чисто.

Если набор становится больше, вы можете использовать:

EnumSet<Foo> valid = EnumSet.of(Foo.X, Foo.Y, Foo.A, Foo.B); 
valid.retainAll(enumSet); 
if (valid.isEmpty()) { 
    ... 
} 

Но я бы держать только то, что для больших дел. Для двух или трех вариантов я использую форму longhand.

+1

Возможно, вам понадобится противоположное ('! Valid.retainAll (enumSet)'), чтобы избежать изменения исходного набора. – assylias

+0

Я собирался прокомментировать точку @ assylias. Вы, вероятно, правы, что это более читаемо, как люди для небольших наборов, просто кажется довольно подробным. – kcoppock

+0

@assylias: Сделано, спасибо. –

1

Метод AbstractSetremoveAll (true, если любой из элементов был найден). Очевидно, вероятно, вы хотите сделать это с клоном исходного набора.

+0

Правда, это хороший способ проверить. Я просто хотел избежать ненужной копии. – kcoppock

+1

комментарий асилии о выполнении противоположного (removeAll исходного набора из набора значений, который вы ищете) также применим здесь. – SJuan76

1

Если вы не можете обновить набор, просто создайте новый ... @assylias прав. Вариант этого заключается в том, чтобы просто создать новый набор, основанный на значениях перечисления, которые вы хотите, и соответственно изменить/проверить.

public enum ResultingState { 
    NOT_PERSISTED, PERSISTED, NOT_CALCULATED, CALCULATED; 
} 
EnumSet<ResultingState> errorsState = EnumSet.of(ResultingState.NOT_PERSISTED, ResultingState.NOT_CALCULATED); 
Collection<ResultingState> results = new HashSet<>(phaseResults.values()); 
boolean containsAny = results.retainAll(errorsState) && results.size() > 0; 
Смежные вопросы