EeBlog(テクニカルブログ)

第10回 列挙型でビットフラグ

前回、「ビットフラグ」についてお話しました。

Java以外の言語では列挙型に数値の値を持っているものが多く、 「ビットフラグ」も列挙型を使用して実装する場合が少なくありません。

Javaもver1.5(Java5)より、列挙型がサポートされました。
列挙型をサポートしている言語の経験者にとっては非常にうれしい事でした。
ところが、列挙型に数値を関連付けできないことは大きな制限に思えたのではないでしょうか?
もちろん、「ビットフラグ」が使用できないためです。

しかし、Javaには「ビットフラグ」に取って代わる機能がちゃんと準備されています。
「EnumSet」クラスです。
前回のサンプルを列挙型と「EnumSet」を使用して変更してみました。
add()メソッドでフラグを立てている(追加する)のと、 contains()メソッドにてチェックを行っていることに注目してください。

public class BitFlgTest2 {

     private enum Question {
         Q001,
         Q002,
         Q003
     }

     public static void main(String[] args) {

         EnumSet<Question> answerList = EnumSet.noneOf(Question.class);

         // Q001
         {
             // 入力待ち
            System.out.print("Q01:ステーキは好きですか? (Y/N) > ");
             char c = input();
             // フラグを立てる
            if (c == 'Y') {
                 answerList.add(Question.Q001);
             }
         }
         // Q002
         {
             // 入力待ち
            System.out.print("Q02:焼き鳥は好きですか? (Y/N) > ");
             char c = input();
             // フラグを立てる
            if (c == 'Y') {
                 answerList.add(Question.Q002);
             }
         }
         // Q003
         {
             // 入力待ち
            System.out.print("Q03:豚カツは好きですか? (Y/N) > ");
             char c = input();
             // フラグを立てる
            if (c == 'Y') {
                 answerList.add(Question.Q003);
             }
         }

         System.out.println();
         System.out.println("あなたの解答は....");

         System.out.print("Q01:ステーキは好きですか? (Y/N) > ");
         System.out.println(answerList.contains(Question.Q001)?"Y":"N");

         System.out.print("Q02:焼き鳥は好きですか? (Y/N) > ");
         System.out.println(answerList.contains(Question.Q002)?"Y":"N");

         System.out.print("Q03:豚カツは好きですか? (Y/N) > ");
         System.out.println(answerList.contains(Question.Q003)?"Y":"N");

         System.out.println("です。");

     }

     private static synchronized char input() {
         char c = 0;
         try {
             do {
                 c = (char)System.in.read();
             } while (c != 'Y' && c != 'N');
         } catch (IOException e) {
             e.printStackTrace();
         }
         return c;
     }

 }

ちなみに、ステーキも焼き鳥も豚カツも好きです…。