Java 列挙型(enum)

Java の列挙型は特別なクラスで、一般的に一組の定数を表します。例えば、1年の4つの季節、1年の12ヶ月、1週間の7日、方角には東西南北などがあります。

Java の列挙型クラスは enum キーワードを使用して定義し、各定数はカンマで,区切ります。

例えば、色の列挙型クラスを定義します。

enum Color 
{ 
    RED, GREEN, BLUE; 
} 

上記の列挙型クラス Color の色定数には RED、GREEN、BLUE があり、それぞれ赤、緑、青を表します。

使用例:

例

enum Color
{
    RED, GREEN, BLUE;
}
 
public class Test
{
    // 実行して出力結果
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

上記のコードを実行すると、出力結果は次のようになります:

RED

内部クラスでの列挙型の使用

列挙型クラスは内部クラス内で宣言することもできます:

例

public class Test
{
    enum Color
    {
        RED, GREEN, BLUE;
    }
 
    // 実行して出力結果
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
    }
}

上記のコードを実行すると、出力結果は次のようになります:

RED

各列挙型は内部で Class を通じて実装され、すべての列挙値は public static final です。

上記の列挙型クラス Color を内部クラスで実装すると次のようになります:

class Color
{
     public static final Color RED = new Color();
     public static final Color BLUE = new Color();
     public static final Color GREEN = new Color();
}

列挙型要素の反復

for 文を使用して列挙型要素を反復処理できます:

例

enum Color
{
    RED, GREEN, BLUE;
}
public class MyClass {
  public static void main(String[] args) {
    for (Color myVar : Color.values()) {
      System.out.println(myVar);
    }
  }
}

上記のコードを実行すると、出力結果は次のようになります:

RED
GREEN
BLUE

switch での列挙型クラスの使用

列挙型クラスはよく switch 文で使用されます:

例

enum Color
{
    RED, GREEN, BLUE;
}
public class MyClass {
  public static void main(String[] args) {
    Color myVar = Color.BLUE;

    switch(myVar) {
      case RED:
        System.out.println("赤");
        break;
      case GREEN:
         System.out.println("緑");
        break;
      case BLUE:
        System.out.println("青");
        break;
    }
  }
}

上記のコードを実行すると、出力結果は次のようになります:

青

values()、ordinal()、valueOf() メソッド

enum で定義された列挙型クラスは、デフォルトで java.lang.Enum クラスを継承し、java.lang.Serializable と java.lang.Comparable の2つのインターフェースを実装しています。

values()、ordinal()、valueOf() メソッドは java.lang.Enum クラスにあります:

  • values() は列挙型クラス内のすべての値を返します。
  • ordinal() メソッドは、配列インデックスのように、各列挙定数のインデックスを見つけることができます。
  • valueOf() メソッドは、指定された文字列値の列挙定数を返します。

例

enum Color
{
    RED, GREEN, BLUE;
}
 
public class Test
{
    public static void main(String[] args)
    {
        // values() を呼び出す
        Color[] arr = Color.values();
 
        // 列挙型を反復処理
        for (Color col : arr)
        {
            // インデックスを確認
            System.out.println(col + " at index " + col.ordinal());
        }
 
        // valueOf() を使用して列挙定数を返す。存在しない場合は IllegalArgumentException エラーが発生
        System.out.println(Color.valueOf("RED"));
        // System.out.println(Color.valueOf("WHITE"));
    }
}

上記のコードを実行すると、出力結果は次のようになります:

RED at index 0
GREEN at index 1
BLUE at index 2
RED

列挙型クラスのメンバー

列挙型は通常のクラスと同じように、独自の変数、メソッド、コンストラクタを使用できます。コンストラクタは private アクセス修飾子のみ使用できるため、外部から呼び出すことはできません。

列挙型は具体的なメソッドを含むことも、抽象メソッドを含むこともできます。列挙型クラスが抽象メソッドを持つ場合、列挙型クラスの各インスタンスはそれを実装する必要があります。

例

enum Color
{
    RED, GREEN, BLUE;
 
    // コンストラクタ
    private Color()
    {
        System.out.println("Constructor called for : " + this.toString());
    }
 
    public void colorInfo()
    {
        System.out.println("Universal Color");
    }
}
 
public class Test
{    
    // 出力
    public static void main(String[] args)
    {
        Color c1 = Color.RED;
        System.out.println(c1);
        c1.colorInfo();
    }
}

上記のコードを実行すると、出力結果は次のようになります:

Constructor called for : RED
Constructor called for : GREEN
Constructor called for : BLUE
RED
Universal Color
その他の拡張