Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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");
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした