检查/或使用EnumSet

kco*_*ock 1 java enums enumset bit-fields

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

if(bitfield & (X | Y) != 0) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

EnumSet等效似乎是:

if(enumSet.contains(X) || enumSet.contains(Y)) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

有更清洁的方法吗?我知道你可以这样检查containsAll():

EnumSet flagsToCheck = EnumSet.of(X, Y);
if(enumSet.containsAll(flagsToCheck)) {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

但这是一个你想知道是否(X & Y)已设置的场景.有没有相同的方法来检查(X | Y)?我认为会有类似于containsAny()方法的东西,但我看不到任何似乎有这种效果的东西.

Jon*_*eet 7

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

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

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

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

  • @kcoppock:我更喜欢"冗长"而不是"聪明",当它实际上更快阅读时.使用位掩码操作我可能每次都要仔细检查它 - 而使用简单的"X或Y"代码读取非常自然. (2认同)