2011/09/11

[java]EnumSetはビットフィールドの代わりにはなりにくいように思った

ビットフィールドを使うときって、何ビット目にはこういうデータ、と決まっているものだと思う。
例えばMifareのAccess Bitsなんかは、bit0がこうで、bit1がああで、と決まっている。

 

EffectiveJavaの項目32に「ビットフィールドの代わりにEnumSetを使用する」というものがあるが、これはビット位置が重要でないく、値を単にビットに割り当てて使っている場合にしか有効ではないと思う。
まあ、Javaでの「ビットフィールド」というものがあるのかもしれんが、私が「ビットフィールド」として使いたいときの代わりにはなりにくいな。

 

ならばどうなったらいいかというと、簡単に数値に変換できることだ。
EnumSetでenumの集合体を作っても、それを数値にするためにはぐるぐる回してやらないといかんと思う。
それくらいなら、最初から整数値を使った方が速いよな、というところ。

 

もちろん、安全性という意味ではいいだろうし、ビット幅など考えなくていいから便利ではある。
なので「集合としてビット値を使っているならばEnumSetにしたまえ」というのがいいんじゃなかろうか。


EffectiveJavaの項目30を見て、代表的なシステムコードをintからenumに置き換えていった。
まあまあうまくいったのだけど、結局は数字として使っていないので、あんまりきれいじゃない。
こういうのを繰り返して、慣れていくしかないのだろうな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。