Javaの列挙型「enum」を徹底解説! 定数を分かりやすく管理する方法

こんにちは。関口です。
 
今回はJavaの列挙型「enum」の使い方をご紹介します。知っておくと便利でわかりやすい記述が行えます。是非覚えていってください。

enumとは

enum(列挙型)は、複数の定数をひとつのクラスとして定義できる型です。関係する複数の定数をまとめて管理したい場合に使用すると良いでしょう。

enumを定義する

では実際に書いてみましょう。例として、月(1月~12月)を定数として定義します。定数は大文字で設定し、カンマ区切りで定義していきます。例では改行していますが、改行しなくても定義可能です。

public class Main {
    /**
     * 月の種別を持つ列挙型
     */ 
    public enum Month {
        JANUARY,
        FEBRUARY,
        MARCH,
        APRIL,
        MAY,
        JUNE,
        JULY,
        AUGUST,
        SEPTEMBER,
        OCTOBER,
        NOVEMBER,
        DECEMBER
    };
}

enumで定義した定数を使用する

では次に、enumで定義した定数(APRIL)を出力してみましょう。クラスのメソッドのように、「列挙子型名.列挙子名」と記載します。

    public static void main(String[] args) throws Exception {
        // enumで定義した定数を出力する
        System.out.println(Month.APRIL);
    }

■出力結果
APRIL

enumに定義されているメソッドを使用する

enumには標準で利用できるメソッドがいくつかあります。まずは利用頻度の高い「values」「ordinal」「name」を使用してみます。

    public static void main(String[] args) throws Exception {
        // valuesメソッドですべての列挙子を取得する
        for (Month mon : Month.values()) {
            // ordinalメソッドで0から始まる位置をint型で取得する
            // nameメソッドで列挙子名を取得する
            System.out.println(mon.ordinal() + ":" + mon.name());
        }
    }

■出力結果
0:JANUARY
1:FEBRUARY
2:MARCH
3:APRIL
4:MAY
5:JUNE
6:JULY
7:AUGUST
8:SEPTEMBER
9:OCTOBER
10:NOVEMBER
11:DECEMBER

定数に文字列を紐づける

enumで定義する定数には、文字列や数値を紐づけることも可能です。まずは文字列だけ紐づけてみます。

public class Main {
    /**
     * 月の種別を持つ列挙型(文字列を紐づけ)
     */ 
    public enum Month {
        JANUARY("1月"),
        FEBRUARY("2月"),
        MARCH("3月"),
        APRIL("4月"),
        MAY("5月"),
        JUNE("6月"),
        JULY("7月"),
        AUGUST("8月"),
        SEPTEMBER("9月"),
        OCTOBER("10月"),
        NOVEMBER("11月"),
        DECEMBER("12月");
        
        // フィールドの定義
        private String tsuki;
        // コンストラクタの定義
        private Month(String tsuki) {
            this.tsuki = tsuki;
        }
        // 定数に紐づけた文字列を取得するメソッドの定義
        public String getTsuki() {
            return tsuki;
        }
    };
}

紐づけた値を使用するためには、コンストラクタやフィールドなどの定義が必要になるので覚えておきましょう。では紐づけた文字列を出力してみましょう。
    public static void main(String[] args) throws Exception {
        // valuesメソッドですべての列挙子を取得する
        for (Month mon : Month.values()) {
            // nameメソッドで列挙子名を取得する
            // getTsukiメソッドで紐づけた文字列を取得する
            System.out.println(mon.name() + ":" + mon.getTsuki());
        }
    }

■出力結果
JANUARY:1月
FEBRUARY:2月
MARCH:3月
APRIL:4月
MAY:5月
JUNE:6月
JULY:7月
AUGUST:8月
SEPTEMBER:9月
OCTOBER:10月
NOVEMBER:11月
DECEMBER:12月

定数に文字列と数値を紐づける

紐づけ方がわかったところで、次は文字列と数値の両方を紐づけてみましょう。

public class Main {
    /**
     * 月の種別を持つ列挙型(文字列と数値を紐づけ)
     */ 
    public enum Month {
        JANUARY("1月", 1),
        FEBRUARY("2月", 2),
        MARCH("3月", 3),
        APRIL("4月", 4),
        MAY("5月", 5),
        JUNE("6月", 6),
        JULY("7月", 7),
        AUGUST("8月", 8),
        SEPTEMBER("9月", 9),
        OCTOBER("10月", 10),
        NOVEMBER("11月", 11),
        DECEMBER("12月", 12);
        
        // フィールドの定義
        private String tsuki;
        private int no;
        // コンストラクタの定義
        private Month(String tsuki, int no) {
            this.tsuki = tsuki;
            this.no = no;
        }
        // 定数に紐づけた文字列を取得するメソッドの定義
        public String getTsuki() {
            return tsuki;
        }
        // 定数に紐づけた数値を取得するメソッドの定義
        public int getNo() {
            return no;
        }
    };
}

コンストラクタとフィールド、取得用メソッドの定義を追加しました。では紐づけた数値を出力してみましょう。
    public static void main(String[] args) throws Exception {
        // valuesメソッドですべての列挙子を取得する
        for (Month mon : Month.values()) {
            // nameメソッドで列挙子名を取得する
            // getTsukiメソッドで紐づけた文字列を取得する
            // getNoメソッドで紐づけた数値を取得する
            System.out.println(mon.name() + ":" + mon.getTsuki() + ":" + mon.getNo());
        }
    }

■出力結果
JANUARY:1月:1
FEBRUARY:2月:2
MARCH:3月:3
APRIL:4月:4
MAY:5月:5
JUNE:6月:6
JULY:7月:7
AUGUST:8月:8
SEPTEMBER:9月:9
OCTOBER:10月:10
NOVEMBER:11月:11
DECEMBER:12月:12

まとめ

いかがでしたでしょうか。
 
Javaの列挙型「enum」は、一見シンプルな構文に見えますが、使いこなすことでコードの見通しが良くなり、保守性や再利用性の高いプログラムを作ることができます。特に、関連する定数を一か所にまとめたり、定数ごとに値を持たせたりできる点は、現場でもよく活用されています。
 
今回紹介したように、基本的な使い方から、文字列や数値の紐づけ、組み込みメソッドの活用まで、enumには多くの機能があります。実際に手を動かしてみることで自然と理解が深まります。
 
ぜひ、enumを活用して、わかりやすくて保守しやすいコードを目指してみてください。それではまた、次回の記事でお会いしましょう!
 
 
 
 
《関連記事》

compareToを使ってみよう
技術
2021.9.14(Tue)

Javaで値の比較がしたい? 数値、日付、文字列のcompareToを使ってみよう!

#まとめ#プログラム#Java

Javaでよく出るエラーと対策5選
技術
2022.1.17(Mon)

これさえ見ればもう怖くない! Javaでよく出るエラーと対策5選

#まとめ#Java

Mapの使い方
技術
2022.4.27(Wed)

【解説】Java初心者向けMapの使い方! HashMapで電話帳を作る

#プログラム#Java

記事をシェア
MOST VIEWED ARTICLES