检查/或使用EnumSet

时间:2013-02-25 19:49:11

标签: java enums bit-fields enumset

所以我在我们的应用程序中将一些位域转换为使用EnumSet,我很好奇是否有更好的方法来对X | Y进行比较。目前我们做的事情如下:

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

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()方法的东西,但我看不到任何似乎有这种效果的东西。

3 个答案:

答案 0 :(得分:6)

我想说现有方法更多可读比你的按位方法。它准确地说出你的意思:如果集合包含X,或者集合包含Y ...保持原样。它已经很干净了。

如果集合变大,您可以使用:

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

但我只保留更大的案例。对于两个或三个选项,我会使用缩写形式。

答案 1 :(得分:1)

您可以使用AbstractSet方法removeAll(如果找到任何元素,则为true)。显然,你可能希望用原始集的克隆来做到这一点。

答案 2 :(得分: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;