スライドショー

【8分でわかる】Enumクラスで文字列を使った比較・変換テクニックをわかりやすく解説!

Enumクラスはとても便利です。

定数として扱うだけでなく自分でメソッドを追加出来たり、既に用意されている便利なメソッドを使ったりすることもできます。

しかし、Enumクラスで文字列を扱う際に

「文字列とEnumの定数を比較したいけどどうすればいいの?」
「switchのcase文で文字列は使えないけどEnumを使うことで実現可能なの?」

などと言ったお声を耳にします。

そういった方にはこの記事を見れば文字列⇔列挙型の変換方法やswitch文で文字列を使った分岐方法がわかるようになります!

enumについて

まず本記事の本題に入る前にenumがどんなものかを軽くおさらいしておきましょう!

次のコードを見て下さい。

protected enum Fruit
{
    Orange,
    Apple,
    Melon
};

public static void main(String[] args)
{
    Fruit fruit_type = Fruit.Orange;

}

このコード自体は特に何かをするものではありませんがmainメソッドよりも前にenumというキーワードが付いたブロック(処理の塊)があります。

このブロックの中で定義されているOrangeやAppleは列挙子と呼ばれています。

enum自体の使い方の解説を深掘りすると本記事の目的に外れてしまうため避けておきますが、

なぜenumを使うのかというと簡単に言ってしまえば読みやすさ(可読性)を向上させることができるからです。

列挙子と文字列を比較したい

Enumを使っていると列挙子と文字列を比較したい場合が出てくるかと思います。

まずは次のコードをみてください。

public enum Fruit
{
    Orange("Ehime"),
    Apple("Aomori"),
    Melon("Ibaraki");
    
    private final String name;
    
    Fruit(String name)
    {
        this.name = name;
    }
}

    
public static void main(String[] args)
{

    Fruit frt = Fruit.Orange;

    if(frt == "Orange")
    {
        System.out.println("Equal!");
    }

}

これはエラーが発生します。

error: incomparable types: Fruitand String

では上記のコードのifの条件をtrueにするにはどうすればよいでしょうか。

二つ方法がありますので見てみましょう。
(if文の部分だけ掲載します。)

if(frt.toString() == "Orange")

または

if(frt == Fruit.valueOf("Orange"))

とすることでエラー無く比較ができるようになります!

valueOfについてはこちらをご覧ください!

【Java】enumでvalueOfメソッドの意味と使い方をわかりやすく解説!
更新日 : 2017年6月25日

switch文で文字列の分岐が可能!?

通常Javaでは文字列をswitch文で分岐させようとするとエラーがでて実行することができません。

しかし、Enumを使うことで擬似的に文字列分岐を行うことができます。

ではどうやってやるか見てみましょう。

public enum Fruit
{
    Orange("Ehime"),
    Apple("Aomori"),
    Melon("Ibaraki");
    
    private final String name;
    
    Fruit(String name)
    {
        this.name = name;
    }
    
    String getName()
    {
        return this.name;
    }

    public static Fruit getEnumName(String str)
    {
        for(Fruit v : values())
        {
            if(v.getName().equals(str))
            {
                return v;
            }

        }
        throw new IllegalArgumentException("undefined : " + str);
    }
}
   
public static void main(String[] args)
{
    switch(Fruit.getEnumName("Ibaraki"))
    {
        case Orange:
            System.out.println("おいしいみかん");
            break;
        case Apple:
            System.out.println("りんごたべたい");
            break;
        case Melon:
            System.out.println("メロンがすべて");
            break;
    }

}

独自メソッドを定義して内部で拡張for文を使ってvaluesメソッドの要素を一つずつ取得していき列挙子の値に一致するものがあればその列挙子を返すという処理になっています。

Enumについてもっと詳しく!

Enumについてもっと詳しく知りたい方は必見です!

【Java入門】Enum(列挙型)の使い方総まとめ
更新日 : 2019年4月25日

switch文の使い方総まとめ

switch文の使い方についてさらに詳しく知りたいときはこちらの記事を確認してください!

まとめ

いかがでしょうか。

列挙子名と文字列を比較したい場合はvalueOfを使いましょう。

列挙子に設定した値を列挙子名に変換して使いたい場合は独自のメソッドを定義することで実現することができます。

もし忘れてしまったらこの記事を思い出して下さい!

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

オータケ

オータケ

30歳、フリーランスプログラマ。中学の頃よりプログラミングに興味を持ちゲーム開発やWebサイト構築などを経験
新しいフレームワークやライブラリに興味があり革新的な機能が含まれていると泣いて喜ぶ。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説