EnumSetの使い方

 EnumSet をあまり見かけないのでC/C++のコードの代替案で提案。

 C/C++などでよく扱うタイプの記述。

 #define BIT(b) (1<<b)
 
 typedef enum {
   POISON = BIT(0),
   PARALYSIS = BIT(1),
   CONFUSION = BIT(2),
 } Status;
 
 Status status;
 
 FLAG_ON( status, POISON ); // 毒ビットを立てる

if( FLAG_CHECK( status, POISON ) ) {

 if( IS_FLAG_ON( status, POISON ) ) {
  // もしその状態ならばごにょごにょ
 }

 JavaでのEnumSet

 enum Status {
   Poison,
   Paralysis,
   Confusion,
 }

 EnumSet<Status> status = EnumSet.noneOf( Status.class );

 status.add( Status.Poison );

 if( status.contains( Status.Poison ) ) {
  // もしその状態ならばごにょごにょ
 }

 パフォーマンスを見ても最適化されているのでビット演算と遜色なく安全。
 final int POISON = (1<<0);
 などとしている人はみな置き換えられる筈だ。(J2SE 5.0ならね)
 Typesafe enum は偉大だと感じる。