1

所以我将我们应用程序中的一些位域转换为使用 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()方法的东西,但我没有看到任何似乎有这种效果的东西。

4

3 回答 3

7

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

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

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

但我只会在更大的情况下保留它。对于两个或三个选项,我会使用速记形式。

于 2013-02-25T19:53:11.260 回答
1

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

于 2013-02-25T19:52:31.500 回答
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;
于 2013-11-15T21:29:47.237 回答