PR

Javaの列挙型(enum)を0から解説【初心者向け】

Java

列挙型(enum)とは、あらかじめ決められた選択肢の中から1つを選ぶ必要がある場面で使用される特別なデータ型です。Javaではenumをうまく活用すると、コーディングミスの防止や可読性の向上、コード全体の保守性を高めることができます。

+---------------------+
|       enum Day      |  <-- 列挙型 (enum)
+---------------------+
| - MONDAY            |  <-- 定数1
| - TUESDAY           |  <-- 定数2
| - WEDNESDAY         |  <-- 定数3
| - THURSDAY          |  <-- 定数4
| - FRIDAY            |  <-- 定数5
| - SATURDAY          |  <-- 定数6
| - SUNDAY            |  <-- 定数7
+---------------------+

「曜日」「四季」のように、選択肢が限られているものを表現するために使用されるため、enum「選択肢の管理者」のような役割を果たします。

関連 Javaの1stステップ:基本的な構文ルールを1分で復習!

スポンサーリンク

Javaの列挙型(enum)とは?

enumは、決まった範囲の値を1つの型としてまとめる役割を持つデータ型の一種。具体的な例として、曜日(MONDAYTUESDAY)や四季(SPRINGSUMMER)を扱う際に便利なデータ型です。

例え話:レストランの注文で・・・

  • レストランでは「ラーメン」「カレー」「ハンバーグ」など、メニューから選んで注文します。これ以外の注文が来ても対応できません。同様に、enumを使えば、プログラム内で定義した選択肢以外の無効な値を防ぐことができます。

enumを使わない場合の問題

選択肢を文字列(String)で扱う場合、タイプミスや異なる表記によるエラーが発生しやすくなります。以下の例を見てください。

// Stringを使った例(エラーの原因)
String day = "Mondai"; // スペルミスによるバグ

// enumを使った例(安全)
Day day = Day.MONDAY; // 決まった選択肢だけが使用可能

要するにタイプミスやコーディングミスを制限するために役立つのがenumのもう1つの側面でもあります。

enumの基本的な使い方

enumの定義と構造

以下のように、Javaのenumは特定の選択肢を定数として宣言します。

public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

ポイント enumの基本的な性質:不変性

  • 要素の追加・削除不可enumの宣言後に要素を追加したり削除することはできません。
  • 要素の再代入不可:プログラムの実行中にenumの要素を新しい値に変更することはできません。
  • 定数はすべて暗黙的にfinalかつstatic:そのため、インスタンス化も変更もできません。
public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

// 以下のコードはコンパイルエラーになる
Day today = Day.MONDAY;
// today = "Holiday"; // エラー: 型が一致しない

enumの要素は型名.要素名で呼び出します(例:Day.MONDAY)。

なぜenumは書き換えられないのか?

理由1:不変性による安全性

  • enumを使うことで、プログラムが予期せぬ変更を受けないようにすることができます。
    例:曜日が動的に変わることは現実的にないため、不変性が理にかなっています。

理由2:メモリの効率化

  • enumの各要素はJavaによってシングルトン(Singleton)として管理され、1つのインスタンスが再利用されます。そのため、新たなインスタンスを作成したり、既存の要素を書き換える必要がありません。

enumの活用例

次のプログラムでは、enumを使って曜日を表示します。

// 列挙型(enum)の定義
enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

public class EnumExample {
    public static void main(String[] args) {
        // 今日の曜日を設定
        Day today = Day.MONDAY;

        // 曜日に応じた条件分岐
        if (today == Day.MONDAY) {
            System.out.println("今日は月曜日です!");
        } else {
            System.out.println("今日は月曜日ではありません。");
        }
    }
}

出力例:

今日は月曜日です!

enumの応用例

enumにメソッドを追加する

enumは定数の集合だけでなく、メソッドを持たせることで、より柔軟な使い方が可能です。

参考 メソッドとは?

enumにメソッドを持たせる理由。例えば「四季」や「状態」を表すenumがあったとしましょう。各季節に「気候の説明」を持たせたい場合、ただの定数ではそれを表現するのは難しいです。

ここで、メソッドを使えば、それぞれの要素に必要な情報を持たせ、簡単に取得できるようになります。

// enumの定義:四季に説明を持たせる
enum Season {
    SPRING("暖かい"), 
    SUMMER("暑い"), 
    FALL("涼しい"), 
    WINTER("寒い");

    private final String description; // 各要素の説明を保持するフィールド

    // コンストラクタ:各要素を初期化
    Season(String description) {
        this.description = description;
    }

    // 説明を取得するメソッド
    public String getDescription() {
        return description;
    }
}

public class EnumMethodExample {
    public static void main(String[] args) {
        // SUMMERの説明を取得
        Season currentSeason = Season.SUMMER;
        System.out.println("今の季節は " + currentSeason + " で、" + currentSeason.getDescription() + "です。");
    }
}

出力結果

今の季節は SUMMER で、暑いです。

enumの内部動作

enumは、内部的にクラス(参考 クラスとは?)として実装され、各要素はシングルトンインスタンスとして生成されます。つまり、同じenum要素を比較する際に==を使うことができ、常に正しい比較が保証されます。

1. enumがクラスとして実装されるとは?

Javaでは、enumはコンパイル時に特別なクラスとして変換されます。これは、各enum要素が通常のクラスインスタンスとして扱われるという意味です。しかし、開発者が自分でインスタンスを生成したり変更することはできません。

enumの内部クラス構造イメージ

以下は、enumが内部的にどのような形でクラスとして扱われるかをイメージ化したものです。

// 実際にはJavaコンパイラによってこのようなクラスに変換される
public final class Day extends Enum<Day> {
    public static final Day MONDAY = new Day("MONDAY", 0);
    public static final Day TUESDAY = new Day("TUESDAY", 1);
    // 他の曜日も同様に定義

    private Day(String name, int ordinal) {
        super(name, ordinal);
    }
}

2. シングルトンパターンの適用

シングルトンとは?

  • シングルトンパターンは、あるクラスのインスタンスが1つだけ存在することを保証するデザインパターンです。
  • enumでは、このシングルトンの特性が自動的に適用されます。

enum要素はシングルトン

enumの各要素(例:MONDAYTUESDAY)は、プログラム全体で一度だけ生成されるインスタンスです。これにより、同じ要素同士を比較するときに**==演算子**を使って正しく比較できるのです。

3. ==演算子による比較の正しさ

通常、Javaでは==演算子はオブジェクトの同一性(同じインスタンスかどうか)をチェックします。例えば、newキーワードで作成したオブジェクト同士を==で比較すると、異なるインスタンスなのでfalseになります。

例:newで作成したオブジェクトの比較

String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);  // false

上記の例では、abは同じ内容でも、異なるインスタンスなのでfalseになります。

enumでの比較

しかし、enumの場合、各要素はシングルトンとして管理されているため、同じenum要素は常に同じインスタンスです。

Day day1 = Day.MONDAY;
Day day2 = Day.MONDAY;
System.out.println(day1 == day2);  // true

ポイント enumの内部動作

  • 各要素はstatic finalなインスタンスとして扱われます。
  • Javaコンパイラはenumをクラスとして変換し、最適化します。
  • ordinal()メソッドを使うと、要素のインデックスを取得できますが、順序に依存しない設計が推奨されます。

実務でのenumの活用例

プロジェクトの進捗状況の管理

public enum Status {
    PENDING, IN_PROGRESS, COMPLETED
}

プロジェクトの進捗を管理する際、enumを使って状態を表現することで、管理を簡潔にします。

Status projectStatus = Status.IN_PROGRESS;
if (projectStatus == Status.COMPLETED) {
    System.out.println("プロジェクトが完了しました!");
}

switch文との連携

switch文(参考 switch文の基本)とenumの組み合わせは、条件分岐を簡潔かつ可読性高く実装するのに有効です。

public class EnumSwitchExample {
    public static void main(String[] args) {
        Day day = Day.FRIDAY;

        switch (day) {
            case MONDAY:
                System.out.println("仕事が始まる日");
                break;
            case FRIDAY:
                System.out.println("週末の前日!");
                break;
            default:
                System.out.println("平日");
        }
    }
}

出力例:

週末の前日!

まとめ Javaのenum(列挙型)

1. enumの基本的な特徴

  • 定数の集合を管理enumは、関連する定数を1つの型にまとめます(例:曜日、季節など)。
  • 変更不可(不変性)enumは宣言後に変更できず、安全なプログラムの作成に役立ちます。
  • コンパクトで可読性の高いコードを実現:enumの要素はif文やswitch文で簡潔に使えます。

2. enumの使い方

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

Day today = Day.MONDAY;
if (today == Day.MONDAY) {
    System.out.println("今日は月曜日です!");
}
  • ==演算子で要素を比較でき、equals()を使う必要がありません。
  • 型安全性を保証し、無効な値が使われるのを防ぎます。

3. enumの内部構造と特性

  • クラスとして実装される:Javaコンパイラはenumを内部的にクラスに変換します。
  • シングルトンインスタンスenumの各要素は一度だけ生成され、プログラム全体で共有されるインスタンスです。
  • ==で比較可能:同じenum要素は同一のインスタンスを指すため、==での比較が安全です。

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
Java
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました