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()) {
    ...
}

しかし、私はそれをより大きな場合にのみ保持します。2 つまたは 3 つのオプションについては、ロングハンド形式を使用します。

于 2013-02-25T19:53:11.260 に答える
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 に答える
1

AbstractSetメソッドを使用できますremoveAll(いずれかの要素が見つかった場合は true)。明らかに、元のセットのクローンでそれを行いたいと思うでしょう。

于 2013-02-25T19:52:31.500 に答える