EnumSet

enumset.png

ビットフィールドの代わりにEnumSetを使用する

C++のフラグ管理のようなやり方は古代のやり方である。
EnumSetは内部的にはビットフィールドで実装されているので、速さには遜色ない。
つまり、今まで自分でやってた面倒くさいビットの演算をEnumSetが自動でやってくれるのである。

古い! good!!
ソースコード
package enumclass;
//ビットフィールド列挙定数 廃れている!
public class Text {
    public static final int STYLE_BOLD            =1<<0;//1
    public static final int STYLE_ITALIC        =1<<1;//2
    public static final int STYLE_UNDERLINE        =1<<2;//4
    public static final int STYLE_STRIKETHROUGH    =1<<3;//8
    public void applyStyles(int styles){}
}
package enumclass;
//ビットフィールド列挙定数 廃れている!
public class Text {
    public enum Style{BOLD,ITALIC,UNDERLINE,STRIKETHROUGH}
    //どのようなSetでも渡せるが、EnumSetが明らかに最善
    public void applyStyles(Set<Style> styles){}
}
使う側のコード
text.applyStyles(STYLE_BOLD|STYLE_ITALIC);
text.applyStyles(EnumSet.of(Style.BOLD,Style.ITALIC));

ダメなポイント

  • 解釈するのが難しい…私は理解できる
  • ビットフィールドで表現されるすべての要素をイテレートするの簡単な方法は無い。

注意!

保持できるenum型は64個まで
EnumSet全体はひとつのlongで表現されている。

Bibliography

enum

サポートサイト Wikidot.com enum