Javaのenumの基本的な使い方

エキサイト株式会社メディア開発佐々木です。Javaの列挙型であるenumの基本的な使い方を共有します。

enumとは

列挙型と言われます。Javaの列挙型はJava1.5の頃から使え、当時の他の言語の列挙型より強力だったという話があります。そして、Javaの列挙型は単なる定数ではなく、オブジェクトとなり、メソッド等を実装することが可能となっています。これにより使い勝手が格段に向上します。

enumの基本

Javaの列挙型は、このような感じで宣言します。

public enum FruitType {
    ORANGE("オレンジ")
    ,APPLE("りんご")
    ,MELON("メロン")
    ,OTHER("その他")
    ;

    private String fruit;

    FruitType(String fruit) {
        this.fruit = fruit;
    }
}

これですぐに使えます。 しかし、これだけだと、使うときに外のクラスで分岐処理してまうことがほとんどです。

FruitType getType(String type){
     if (FruitType.ORANGE.name().equals(type)) {
         return FruitType.ORANGE;
     }
     if (FruitType.APPLE.name().equals(type)) {
         return FruitType.APPLE;
     }
     if (FruitType.MELON.name().equals(type)) {
         return FruitType.MELON;
     }
     return FruitType.OTHER;
}

こういう分岐処理を外部クラスがやると、内部情報が漏れてしまっていて、弱い設計になってしまいます。

enumはこう使うと便利

enumはこのままだと、ただの定数扱いですが、Javaenumは、Enumクラスというものを継承しており、さらにメソッド等を実装することで処理を内部に閉じ込めて保守性も高く使いやすいものになります。

public enum FruitType {
    ORANGE("オレンジ")
    , APPLE("りんご")
    , Melon("メロン")
    , OTHER("その他");

    private String fruit;

    FruitType(String fruit) {
        this.fruit = fruit;
    }

    private static final Map<String, FruitType> map;
    static {
        Map<String, FruitType> typeMap = Arrays.stream(FruitType.values()).collect(Collectors.toMap(e -> e.name(), e -> e));
        map = Collections.unmodifiableMap(typeMap);
    }


    public static FruitType get(String fruit) {
        return map.getOrDefault(fruit, FruitType.OTHER);
    }
}

static変数やstaticメソッドを使用して

FruitType getType(String type){
    return FruitType.get(type);
}

呼び出しはこんな感じになるので、内部情報も隠蔽できていてenumとしての要件も満たせています。

さいごに

今回はenumの初歩の初歩ですが、他の言語にはenumが無いこともあるので、紹介させていただきました。しっかり使いこなせればとても有用なものになると思います。

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを絶賛募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

www.wantedly.com