20

EnumSet、それ自体と同じくらい古いenum(両方とも Java 5 以降) は、ビットフィールドのユースケースの妥協のない代替品であると想定されています。 . 一方、最新の、そして何年にもわたって最も期待されている Java API である Streams API は、恥ずかしがらずにSpliterator特性にビットフィールドを採用しています。

上記のことは、Java のコア エキスパートによる明らかな承認であり、EnumSet結局のところそれほど良くないと考えるべきでしょうか? ビットフィールドを使用しないという一般的なベストプラクティスのアドバイスを再考する必要がありますか?

4

2 に答える 2

24

ではなくビットフィールドを使用していることに驚いたEnumSet. ただし、このメーリング リストのスレッドで議論されています。その理由は、呼び出し元の特性に影響を与えることなく、さまざまな特性を設定および設定解除できるようにするためだったようです。を使用すると、これを実装するには、さまざまな段階でオブジェクトを変更する必要があるたびにEnumSet、新しいオブジェクトを作成する必要があります。EnumSetこれが、ビットフィールドがそこで競争に勝つ理由だと思います。

そのスレッドの最後の文は、本質的にここでのあなたの質問を予期しています:

Java 8 API にそのようなフラグが存在することは、人々が 10 年以上にわたって言われてきたことに反するため、多くの眉をひそめるでしょう (そしてそうすべきです)。それがそのまま採用されるのであれば、代替案が却下された理由について、ドキュメントの読者に適切な説明がなされるべきです。「私たちは int フラグに慣れていましたが、他にそれ自体がはるかに優れているものは何もありませんでした」とは言えません。「int フラグが API に適していないことはわかっていますが、より良い代替手段を見つけるのに非常に苦労しましたが、役に立ちませんでした」(それが本当なら)。

于 2014-03-23T20:35:00.950 に答える
-2

ビットフィールドを使用しないという一般的なベストプラクティスのアドバイスを再考する必要がありますか?

はい。「常に」または「決して」という言葉を含むアドバイスは、それが「一般的」であるかそれほど一般的でないかに関係なく、通常は再考する必要があります。

于 2014-03-23T20:24:33.533 に答える