パソナについて
記事検索

Javaの定数はenum型で処理!使い方を解説

今回はenum型の特徴や使い方、switch文と組み合わせた実例を解説します。

Javaの定数はenum型で処理!使い方を解説

今回はenum型の特徴や使い方、switch文と組み合わせた実例を解説します。

スキルアップ

2022/03/17 UP

enumは変数型のひとつで、列挙型と呼ばれています。列挙型とは、名前の付いた定数の集まりで、定義される定数は列挙子リストと呼びます。この変数は曜日や月、年号など、特定の値しか取らないデータを扱い、主にswitch文と組み合わせて使用されます。

今回はenum型の特徴や使い方、switch文と組み合わせた実例を解説します。

Javaのenumってなに?

enum(列挙型)は曜日や年号、固有名詞など、特定の値しか取らない定数の集まりです。定数は列挙子リストと呼びます。運用の仕方によっては、複数ある定数を効率よく管理できる便利な変数型です。

enum(列挙型)は特定の値しか取らないデータのこと

基本的なenumの初期化は以下のように記述します。

基本型:

        
アクセス修飾子 enum 列挙型の名前
{
  要素1, 要素2, …, 要素n
}

定義した列挙型は、mainメソッド内などから「列挙型名.要素名」の形式で使用できます。

enumはクラスのように扱えますが、インスタンス化できないという特徴があります。enumのインスタンス化は、enum内部で行う一度だけなので、つまりenumの各インスタンスはプログラム全体の中でたったひとつであることが保証されます。

この特徴によって、enumが定数として機能します。

以下のサンプルでは、weekというenumを定義しています。SundayからSaturdayまでの曜日が列挙子として格納されています。

サンプルコード:

        
public enum week
{
    Sunday,
    Monday,
    Tuesday,
    Wednesday,
    Thursday,
    Friday,
    Saturday
}

enumはどんなときに使う?

enumは、曜日や血液型、星座、都道府県名など、似たような意味を持ち、値がまったく変化しない複数の定数を、プログラムの中で何度も使うときに便利です。

同じチームのメンバーの名前や、営業所の名前など、さまざまな定数をまとめて管理できるので、定数を元にして条件を分岐するのに便利です。

そのため、if文やswitch文とともに使用することが多く、定数以外の値が入ることを想定しなくてもよいenumを使用したコードは、可読性が高い、すっきりとした記述になります。

enum(列挙型)クラスを使用するときの注意点

enumは、使用上、いくつかの注意点があります。

まず、enumの列挙子に値を付与する際には、フィールドとコンストラクタを定義する必要があります。

また、この際のコンストラクタのアクセス修飾子はprivateのみ使用できます。

なお、付与する値は、数値でも文字列でも可能です。

なおenumは別のクラスを継承することはできません。しかし、インターフェースを実装することは可能です。

enumの使い方

多くの場合、enumはswitch文とともに使用されます。例えば、決まった曜日にだけ行われる処理や、営業所ごとに異なる処理をする場合など、enumで管理している定数を分岐の条件とすることは多々あります。

今回はenumの基本的な使い方や、使用頻度が多い処理を中心に解説します。

enumの基本的な使い方

switch文でcaseの値にenumを使用すると、簡潔に記述でき、すっきりとしたコードになります。

サンプルではenumで曜日を定義した変数weekを使い、case文で曜日の判定を行っています。

        
public class main {

    protected enum week {
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday
    };

    public static void main(String[] args) {
        week week_day = week.Sunday;

        switch(week_day) {
            case Sunday:
                System.out.println("日曜日です");
                break;
            case Monday:
                System.out.println("月曜日です");
                break;
            case Friday:
                System.out.println("金曜日です");
                break;
        }
    }
}

このサンプルを実行すると以下のように表示されます。

サンプル1 クリックして拡大

列挙子として宣言した文字列を取得する

enumクラスにはnameメソッドとtoStringメソッドがあります。これらを利用して、列挙子として宣言した文字列を取得することができます。

nameはプログラム上重要な目的で列挙子を使用する場合に適していますが、通常はenumの中でオーバーライドできるtoStringを使用します。列挙子を文字列として取得する場合は、基本的にはtoStringを使用しましょう。

サンプルでは、変数weekの中から、Mondayを取得するため、toStringメソッドを使用して定数を文字列として読み出しています。

サンプルコード:

        
public class main {

    protected enum week {
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday
    };

    public static void main(String[] args) {
        String getweek = week.Monday.toString();
        System.out.println(getweek);
    }
}

このサンプルを実行すると以下のように表示されます。

サンプル2 クリックして拡大

引数の文字列に合致する列挙子を挙げる

valueOfメソッドを使用することで、列挙子名を取得できます。

以下のサンプルでは、変数weekの列挙子Sundayと、変数weekからvalueOfで取得したSundayと合致する列挙子を比較し、一致しているか比較しています。

サンプルコード:

        
public class main {

    protected enum week {
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday
    };

    public static void main(String[] args) {
        if (week.Sunday == week.valueOf("Sunday")) {
            System.out.println("日曜日です");
        }
        else{
            System.out.println("日曜日ではありません");
        }
    }
}

このサンプルを実行すると以下のように表示されます。

サンプル3 クリックして拡大

列挙子を網羅的に処理する

enumに含まれる列挙子をすべて取得するには、valuesメソッドを使用します。valuesメソッドを使用することで、列挙子を網羅的に処理できるようになります。

例えば、格納されている列挙子に対してすべて同じ処理を行いたい場合、for文で繰り返し処理をしたい場合などに便利です。

サンプルでは変数weekに格納されている列挙子を、for文によって繰り返しvaluesメソッドで取得し、変数wdに代入して表示しています。

サンプルコード:

        
public class main {
    protected enum week {
        Sunday,
        Monday,
        Tuesday,
        Wednesday,
        Thursday,
        Friday,
        Saturday
    };

    public static void main(String[] args) {
        for (week wd : week.values()) {
            System.out.println(wd);
        }
    }
}

このサンプルを実行すると以下のように表示されます。

サンプル4 クリックして拡大

enum型は変化のない値を管理するのに便利

enumは変化のない値(定数)を管理するのにとても便利なクラスです。主にswitch文と組み合わせることで、特定の値しか取らないデータを使い回し、条件を分岐させて処理するのに頻繁に使用されます。

定数を扱うクラスとして、実務でも非常によく使用するので、基本的な使い方や文字列としての取得方法などを覚えておくとよいでしょう。