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