Stringによるswitch制御

enumを利用してStringによるswitch制御を行うサンプルコード。

解説

ご存知の通り、Javaにおけるswitch文の条件判定にはStringを使用することができません。しかし、enumを利用することによって、この問題を解決することができます。enumによる擬似String-switch制御のサンプルコードを掲載しているサイトがこちら。
A Switch on String Idiom for Java
解説も丁寧で、非常に参考になる記事だと思います。


さて、条件判定に使用する文字列をそのままenumメンバの名前として使用できる場合には上記のサイトで紹介されているコードで問題ないのですが、必ずしもそうではないケースも出てくると思います。そういう場合のサンプルです。まずは、enum型のコードから:

public enum Animal {

    DOG("犬"), CAT("猫"), MONKEY("猿"), NOT_ANIMAL("");

    private final String name;

    private Animal(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return name;
    }

    public static Animal toAnimal(String name) {

        Animal result = null;

        for (Animal animal : values()) {
            if (animal.toString().equals(name)) {
                result = animal;
                break;
            }
        }

        return result != null ? result : NOT_ANIMAL;
    }

}

このenum型を使用したswitch文のサンプル:

switch (Animal.toAnimal(animalName)) {

    case DOG:
        // "犬"の場合の処理
        break;

    case CAT:
        // "猫"の場合の処理
        break;

    case MONKEY:
        // "猿"の場合の処理
        break;

    default:
        // それ以外の場合の処理
        break;

}

という具合に、やりたいことが実現できると思います。サンプルでは分かりやすくするためにtoAnimalメソッドの中で毎回ルックアップしていますが、プロダクションに使う際にはstaticコンストラクタなどを使ってキャッシュした方が良いでしょうね。


なお、enum型の応用的な使用方法についてはBlochの"More Effective Java"で詳しく解説されています。

Effective Java (Java Series)

Effective Java (Java Series)


関連リンク

補注

今回のエントリは純粋に「Stringによるswitch制御はどうすれば書けるのか」という観点から書いています。しかし「ここまでしてswitchを実装しなければならないのか」という話は、これとは別に考えなければならないものだということを、最後に強調しておきたいと思います。