Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaのタイプセーフな列挙型(enum)とは?特徴と使い方をわかりやすく解説

タイプセーフな列挙型(Type-Safe Enum)とは

Javaの列挙型(enum)にはタイプセーフ(型安全)という重要な特徴があります。これは、enumが独自の名前空間を持つため、enum定数として宣言された値以外を代入できないことを意味します。仮に存在しない値を代入しようとすると、コンパイルエラーとして検出されます。このタイプセーフなenumはJava 1.5(JDK 5)で導入されました。

さらに、enumは参照型であり、その振る舞いはクラスやインターフェースに非常に近いものです。そのため、プログラマーはenum宣言の中にメソッドや変数を自由に定義することができます。

例1:基本的なenumの定義と使用

まずは、最もシンプルなenumの定義と、すべての定数を出力する例を見てみましょう。

import java.util.*;

enum JobType {
    permanent,
    contract
}

public class EnumTest1 {
    public static void main(String[] args) {
        print(JobType.values());
    }

    public static void print(JobType[] list) {
        for (int i = 0; i < list.length; i++) {
            System.out.println(list[i]);
        }
    }
}

実行結果

permanent
contract

values()メソッドを使用すると、enumに定義されたすべての定数を配列として取得できます。このように、enumは定義済みの値だけを扱うため、誤った値によるバグを未然に防げます。

例2:定数ごとに異なる処理を実装する

enumでは、抽象メソッドを宣言し、各定数ごとに個別の実装を持たせることも可能です。これにより、定数ごとに異なる振る舞いを定義できます。

enum JobType {
    permanent {
        public void print(String str1) {
            System.out.println("This is a permanent " + str1);
        }
    },
    contract {
        public void print(String str2) {
            System.out.println("This is a contract " + str2);
        }
    };

    abstract void print(String name);
}

public class EnumTest2 {
    public static void main(String[] args) {
        JobType dt1 = JobType.permanent;
        JobType dt2 = JobType.contract;
        dt1.print("job");
        dt2.print("job");
    }
}

実行結果

This is a permanent job
This is a contract job

この例では、JobTypeに抽象メソッドprint()を宣言し、permanentcontractのそれぞれの定数内でオーバーライドしています。enum本体の末尾には必ずセミコロン(;)が必要になる点に注意してください。

まとめ

タイプセーフなenumを活用することで、不正な値の代入をコンパイル時に検出でき、コードの安全性と可読性が大きく向上します。また、enumはクラスのようにメソッドやフィールドを持てるため、単なる定数の集まりにとどまらず、柔軟で表現力豊かな設計が可能になります。

  1. JavaのStringIndexOutOfBoundsExceptionとは?発生原因と対処法をわかりやすく解説

    StringIndexOutOfBoundsExceptionとはJavaにおいて、文字列(String)は一連の文字を格納するために使用され、オブジェクトとして扱われます。文字列は、java.langパッケージに含まれるStringクラスによって表現されます。文字列の作成方法は主に2つあります。1つは他のオブジェクトと同様にnewキーワードを使用する方法、もう1つはプリミティブ型のようにリテラルを直接代入する方法です。String stringObject = new String(Hello how are you); String stringLiteral = Welcome to T

  2. JavaのArrayIndexOutOfBoundsExceptionとは?発生原因と対処法を解説

    配列とインデックスの基本 配列(Array)とは、同じ型の要素を固定サイズで順番に格納するためのデータ構造(コンテナ/オブジェクト)です。配列のサイズ(長さ)は生成時に決定され、後から変更することはできません。 配列内の各要素の位置は「インデックス(添字)」と呼ばれます。Javaの配列は0始まりのため、最初の要素はインデックス0、2番目の要素はインデックス1、というように順に番号が割り当てられます。 配列の各要素へは、「配列名[インデックス]」という形式の式を使ってアクセスします。 System.out.println(myArray[3]); // 1457 が出力される たとえばサイズ7