列挙型(Enum)に文字列や数値を利用する備忘録

  • 68
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Android の開発をしていると、値の取りうる値が数パターンの場合は、列挙型(Enum)を使いたくなります。

public enum Type {
    TYPE1,
    TYPE2,
    TYPE3,
}

列挙型をメソッドの引数にすると、取りうる値を制限できて何かと間違いが減りますし、

public void hoge(Type type) {
    //...
}

条件分岐のキーにしたりできて便利です。

switch (type) {
    case TYPE1:
         //...
         break;
    case TYPE2:
         //...
         break;
    case TYPE3:
         //...
         break;
}

ですが、列挙型に文字列や数値を使いたいこともあります(つまり数パターンの文字列や数値の表現に列挙型を利用する)。Androidの場合は Bundle に詰め込んだり、画面に表示したり、データストアに格納する時でしょうか。

文字列として利用する場合は、次のようにコンストラクタと、値の取得メソッドを定義します。

public enum Type {
    TYPE1("AAA"),
    TYPE2("BBB"),
    TYPE3("CCC"),
    ;

    private final String text;

    private Type(final String text) {
        this.text = text;
    }

    public String getString() {
        return this.text;
    }
}

普通に列挙型としても利用できますし、

Type type = Type.TYPE1;

次のように文字列としても利用できます。

String text = Type.TYPE1.getString();
Log.i("enumテスト", text); // AAA が出力される

同様に、数値として利用する場合は次のようにします。

public enum Type {
    TYPE1(10),
    TYPE2(20),
    TYPE3(30),
    ;

    private final int id;

    private Type(final int id) {
        this.id = id;
    }

    public int getInt() {
        return this.id;
    }
}

利用する場合は次のとおり。

int id = Type.TYPE1.getInt();
Log.i("enumテスト", "" + id); // 10 が出力される

更に次のように、複数の値を持たせることも出来ます。

public enum Type {
    TYPE1("AAA", 10),
    TYPE2("BBB", 20),
    TYPE3("CCC", 30),
    ;

    private final String text;
    private final int id;

    private Type(final String text, final int id) {
       this.text = text;
       this.id = id;
    }

    public String getString() {
        return this.text;
    }

    public int getInt() {
        return this.id;
    }
}
String text = Type.TYPE1.getString();
int id = Type.TYPE1.getInt();

Log.i("enumテスト", text); // AAA が出力される
Log.i("enumテスト", "" + id); // 10 が出力される

追記(2015/04/20)

数値等から Enum へ変換するメソッドも合わせて用意すると良さげ。

public class Hoge {

    public static enum Type {
        TYPE1(10),
        TYPE2(20),
        TYPE3(30),
        ;

        private final int id;

        private Type(final int id) {
            this.id = id;
        }

        public int getInt() {
            return this.id;
        }
    }

    public static Type getType(final int id) {
        Type[] types = Type.values();
        for (Type type : types) {
            if (type.getInt() == id) {
                return type;
            }
        }
        return null;
    }
}
Enumから数値への変換
int id = Hoge.Type.TYPE1.getInt();
数値からEnumへの変換
Type type = Hoge.getType(10);

追記(2015/05/07)

Enum の要素を文字列として表現したいだけであれば、特別なコンストラクタやメソッドを用意しなくても次のように変換できる。

Enumから文字列への変換
Type.TYPE1.name();
文字列からEnumへの変換
Type.valueOf("TYPE1");