Java入門enum(列挙型)を徹底解説!使いどころも紹介

公開日:2021.09.30

スキルアップ
 

Javaのenum(列挙型)は、ソースコードの可読性を高め、メソッドの引数や戻り値として利用することで、ソースコードの安全性を高めることもできる便利な型です。本記事では、Javaのenum(列挙型)の特徴や基本の使い方、そしてenumで使えるメソッドなどについて、サンプルコードを交えながら解説していきます。

Javaのenum型(列挙型)とは

Javaのenum(列挙型)とは、複数の定数を一つのクラスとしてまとめておくことができる型です。enumで定義する定数を列挙子と呼びます。列挙型は、クラスとして定義されるので、フィールドやメソッドも定義できる点が大きな特徴です。列挙型の特徴について、もう少し詳しく見ていきましょう。

クラスのように扱えるがインスタンス化できない

enumにフィールドやメソッドを定義する場合は、クラスの定義時に指定します。このように、enumはクラスのように扱えますが、インスタンス化できない点が大きな特徴です。enumのインスタンス化は、enum内部で行う1回きり。

つまり、enumの各インスタンスは、プログラムの中で一つということが保証されます。そのため、enumは定数として利用できるのです。

基本の書式と命名規則

enumの基本の書式は、以下の通りです。


    public enum 列挙型名{
        列挙定数1,
        列挙定数2,
        (中略)
        列挙定数N
      };

列挙定数の命名規則は、一般的にすべて大文字にします。上記の宣言を使い、果物の列挙型を定義すると以下の通りです。


    enum Fruits{
        BANANA,
        ORANGE,
        APPLE
    };

enumを宣言するクラスの命名規則は、一般的に「enum列挙型名.java」となります。上記の場合は「EnumFruits.java」です。

初期値に数値や文字列の値を定義する場合は、以下のようにフィールドやコンストラクタの定義も行います。

【数値の値を定義する場合】


    public enum Fruits {
        Banana(0),
        Orange(1),
        Apple(2);

        private int id; // フィールドの定義

        private Fruit(int id) { // コンストラクタの定義
          this.id = id;
        }

      }


【文字列の値を定義する場合】


    protected enum Fruits {
        Banana("Okinawa")
        Orange("Ehime"),
        Apple("Aomori");

      private String madein; // フィールドの定義
      private Fruit(String madein) { // コンストラクタの定義
          this.madein = madein;
        }
      }

enum型を使ったサンプルコード

では、enumを使ったサンプルコードを示します。


    class EnumFruisSample {
        void printFruits(Fruits fruits) {
        System.out.println(fruits);
        }

        void callPrintFruits() {
        printFruits(Fruits.BANANA);
        printFruits(Fruits.ORANGE);
        printFruits(Fruits.APPLE);
        }

        Fruits getApple() {
            return Fruits.APPLE;
        }
    }

このように、enumをメソッドの引数や戻り値に使うことも可能です。enum型を使用する際は、クラスのメソッドのように、「列挙子型名.列挙子名」と記載します。

Javaのenum型の使い方

ここからは、Javaでどのようにenumを使用するか、コード断片を交えながら解説します。

基本の使い方

先ほどご紹介したenumのFruitsを使ったコードを見ていきましょう。


    System.out.println(Fruits.BANANA);// "BANANA"が出力される
    System.out.println(Fruits.LEMON);// コンパイルエラー

列挙型へのアクセスは、クラスで定義するstaticフィールドと同じように、「列挙子型名.列挙子名」と記載します。列挙型Fruitsには、LEMONが定義されていないため、上記のように記載してもコンパイルエラーとなり、定義した列挙定数でなければプログラムを実行できません。

enumで宣言した値は、enum自身のインスタンスであり、StringやIntegerではない点に注意しましょう。また、enumはプリミティブ型やクラスと同じように、型としても扱えます。


    Fruits fruits1 = Fruits.BANANA;
    Fruits fruits2 = Fruits.ORANGE;

もちろん、メソッドの引数や戻り値としても使用できます。メソッドの引数や戻り値として列挙型を使うメリットは、列挙型で定義した定数以外の値が入ってくる可能性を排除できるという点です。

条件分岐(switch・if)での使い方

条件分岐(switch・if)でenumを使う際のサンプルコードは、以下の通りです。


    Fruits = Fruits.BANANA;

    if (fruits == Fruits.BANANA) {
        System.out.println("バナナです"); // → この行が実行される
    } else if (fruits == Fruits.ORANGE) {
        System.out.println("みかんです");
    } else if (fruits == Fruits.APPLE) {
        System.out.println("林檎です");
        //その他の値が入ってくることは考慮しなくて良い
    }

    Fruits = Fruits.ORANGE;

    switch (fruits) {
        case BANANA):
            System.out.println("バナナです");
            break;
        case ORANGE:
            System.out.println("みかんです"); // → この行が実行される
        break;
    case APPLE:
        System.out.println("APPLE");
        break;
    //その他の値が入ってくることは考慮しなくて良い
    }

enum型の定数を定義すると、その定数に定数以外の値を入れようとしてもコンパイルエラーとなり、修正しなければプログラムを実行できません。そのため、enum型の定数を使った条件分岐では、定数以外の値が入ってくることを想定しなくても済み、すっきりとした記述になります。

Javaのenumに定義されているメソッドの使い方

enumには、標準で利用できるメソッドがいくつかあります。中でも利用頻度の高いメソッドであるvalueOf・ordinal・valuesの各メソッドの使い方について、サンプルコードを交えながら解説します。

valueOfメソッドで列挙子名を取得する

valueOfメソッドは、引数で指定した文字列から列挙子名を取得する場合に使用します。サンプルコードで確認しましょう。


    public class Main {

        public static void main(String[] args) {
          if(Fruits.ORANGE == Fruits.valueOf("ORANGE")) {
            System.out.println("一緒です。");
          }
        }

        protected enum Fruits {
          BANANA,
          ORANGE,
          APPLE
        };
      }

enumのordinalメソッドを使う

Enumにあらかじめ用意されているordinalメソッドは、enumの列挙宣言での0から始まる位置をintで返すメソッドです。以下は、そのサンプルコードです。


    public class Main {

        public static void main(String[] args) {
          for(Fruits frt : Fruits.values()) {
            System.out.println(frt.ordinal() + ":" + frt.name() + "," + frt.getMadein());
          }
        }

        protected enum Fruits {
          Banana("Okinawa")
          Orange("Ehime"),
          Apple("Aomori")
      };

      private String madein;

      private Fruits(String madein) {
        this.madein = madein;
      }

      public String getMadein() {
        return this.madein;
      }
    }

上記の実行結果は、以下の通りです。


    [0]Banana,Okinawa
    [1]Orange,Ehime
    [2]Apple,Aomori

valuesメソッドですべての列挙子を取得

Enumのvaluesメソッドは、すべての列挙子を返却するメソッドです。以下は、そのサンプルコードです。


    public class Main {
        public static void main(String[] args) {
          for(Fruits frt : Fruits.values()) {
            System.out.println(frt);
          }
        }

        protected enum Fruits {
          Banana,
          Orange,
          Apple
        };
      }

enum型には、どのようなメソッドがあらかじめ用意されているかも把握しておきましょう。

Javaのenumを使いたいケース

Javaのenumを積極的に使いたいケースは、以下の通りです。

定数の種類・数を明確にしたいとき

例えば、四季(春夏秋冬)のように、定数の種類と数が明確に決まっているようなものを扱う場合は、enumの利用が適しています。enumを利用する大きなメリットの一つは、定数の種類と数を明確にし、それ以外の値は取り得ないことが保証されている点です。

定数の定義としては、Static finalとして定義したStringやintも可能ですが、値の種類や数を強制できない点にあります。

戻り値を明確化してプログラムの安全性・確実性を高めたいとき

enumの引数・戻り値を使ったメソッドは、コンパイル時点で値の種類・数が確定し、定義以外の値をやり取りできません。戻り値が明確になることで、プログラム全体の安全性や確実性を高められます。

Javaのenum型(列挙型)を使いこなそう

Javaのenum型(列挙型)は、複数の定数を一つのクラスとして定義できる便利な型です。種類や数がはっきりと決まっている定数を列挙型で定義しておくと、定義以外の値が入ってくることを防止できます。

メソッドの引数や戻り値が決まっている場合は、列挙型を積極的に使うことでプログラムの安全性や確実性を高めることも可能です。使いどころによって大きなメリットがあるため、列挙型を使いこなせるようになりましょう。

Javaの知識を身に付け、業務経験を積む際はAKKODiSにご相談ください。あなたのキャリアに合わせたさまざまな職種をご紹介可能です。AKKODiSの求人に応募して、業務経験を積み重ねていきましょう。

(2021年9月現在)

AKKODiSコンサルティングに関するお問い合わせ