Java では、列挙 (enum) は、名前付き定数のグループを定義するために使用される特別な型です。
- 列挙型は、整数値に意味のある名前を割り当てることで、プログラムの可読性の保守性と型の安全性に役立ちます。
- 主に、道順の曜日など、アイテムに使用できる値のセットが少ない場合に役立ちます。
列挙型の作成
構文:
Javaenum 列挙名 {
定数1 定数2 定数3;
}
enum TrafficLight { RED GREEN YELLOW; } public class Test{ public static void main(String[] args){ TrafficLight x = TrafficLight.RED; System.out.println(x); } }
出力
RED
Javaでのenumの宣言
Enum 宣言はクラスの外でもクラス内でも実行できますが、メソッド内では実行できません。
1. 授業外での宣言
上記の例で見たように、列挙型はクラスの外で宣言して直接アクセスできます。
2. クラス内での宣言
列挙型はクラス内で宣言することもできますが、メソッド内では宣言できません。
Java
public class Test { enum Color { RED GREEN BLUE; } // Driver method public static void main(String[] args) { Color c1 = Color.RED; System.out.println(c1); } }
出力
RED
JavaのEnumのプロパティ
以下に示すように、特定のプロパティの後に Enum が続きます。
- クラスタイプ: 内部的にはクラスとして実装されます。
- 列挙定数: 各定数は列挙型のオブジェクトです。
- スイッチのサポート: switch ステートメントで使用できます。
- 暗黙的な修飾子: 定数は public staticfinal です。
- 継承: Enum はクラスを拡張できませんが、インターフェイスを実装できます。
Switch ステートメントの列挙型
enum を switch ステートメントで使用すると、enum 定数に基づいてさまざまなケースを処理できます。
Javaimport java.io.*; class GFG{ // Enum Declared enum Color { RED GREEN BLUE YELLOW; } public static void main(String[] args){ Color var_1 = Color.YELLOW; // Switch case with Enum switch (var_1) { case RED: System.out.println('Red color'); break; case GREEN: System.out.println('Green color'); break; case BLUE: System.out.println('Blue color'); break; default: System.out.println('Other color'); } } }
出力
Other color
メソッドとコンストラクターを含む列挙型
列挙型には、定数ごとに個別に実行されるコンストラクターとメソッドを含めることができます
Javaenum Color{ RED GREEN BLUE; private Color(){ System.out.println('Constructor called for: ' + this); } public void display(){ System.out.println('Color is: ' + this); } } public class Test{ public static void main(String[] args){ Color c1 = Color.RED; c1.display(); } }
出力
Constructor called for: RED Constructor called for: GREEN Constructor called for: BLUE Color is: RED
抽象メソッドを含む列挙型
Enum では、各定数が実装する必要がある抽象メソッドを宣言できます。
Javaenum Day{ MONDAY{ public String getNumber(){ return '1st day'; } } FRIDAY{ public String getNumber(){ return '5th day'; } }; public abstract String getNumber(); } public class EnumTest { public static void main(String[] args){ System.out.println(Day.MONDAY.getNumber()); System.out.println(Day.FRIDAY.getNumber()); } }
出力
1st day 5th day
value() を使用した列挙型の反復
EnumType.values() を使用して、すべての enum 定数をループします。
Javaenum Color{ RED GREEN BLUE; } public class Test{ public static void main(String[] args){ for (Color c : Color.values()){ System.out.println(c); } } }
出力
RED GREEN BLUE
Enum と EnumSet (特定の範囲の反復)
EnumSet.range() を使用すると、特定の範囲の enum 定数に対する反復が可能になります。
Javaimport java.util.EnumSet; public class EnumSetExample{ enum Day{ SUNDAY MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY; } public static void main(String[] args){ EnumSet<Day> workDays = EnumSet.range(Day.TUESDAY Day.FRIDAY); for (Day d : workDays){ System.out.println(d); } } }
出力
TUESDAY WEDNESDAY THURSDAY FRIDAY
Enum メンバーを使用したクラスの作成
列挙型と通常のクラスを組み合わせて、プログラム ロジックを編成できます。 enum はクラス内のメンバー変数にすることができ、メソッドは enum 値に基づいてアクションを実行できます。
Java/*package whatever //do not write package name here */ import java.io.*; enum Day { MONDAY TUESDAY WEDNESDAY THURSDAY FRIDAY SATURDAY SUNDAY } public class EnumTest { // Enum member variable Day day; // constructor which takes enum value public EnumTest(Day day) { this.day = day; } // method to execute action as per enum value public void tellItLikeItIs() { switch (day) { case MONDAY: System.out.println('Mondays are tough'); break; case TUESDAY: System.out.println('Tuesday are better'); break; case WEDNESDAY: System.out.println('Wednesday are okay'); break; case THURSDAY: System.out.println('Thursdays are hopeful'); break; case FRIDAY: System.out.println('Fridays are exciting'); break; case SATURDAY: System.out.println('Saturdays are relaxing'); break; case SUNDAY: System.out.println('Sunday are for rest'); break; default: System.out.println('Everyday are good'); break; } } public static void main(String[] args) { EnumTest firstDay = new EnumTest(Day.MONDAY); firstDay.tellItLikeItIs(); EnumTest thirdDay = new EnumTest(Day.WEDNESDAY); thirdDay.tellItLikeItIs(); EnumTest fifthDay = new EnumTest(Day.FRIDAY); fifthDay.tellItLikeItIs(); EnumTest sixthDay = new EnumTest(Day.SATURDAY); sixthDay.tellItLikeItIs(); EnumTest seventhDay = new EnumTest(Day.SUNDAY); seventhDay.tellItLikeItIs(); } }
出力
Mondays are tough Wednesday are okay Fridays are exciting Saturdays are relaxing Sunday are for rest
説明:
- 上記のコードの EnumTest クラスは、Day 型のメンバーで作成されます。 Day enum を引数として受け取り、それを割り当てるコンストラクターがあります。
- このクラスには、日の値に基づいてメッセージを出力するメソッド TellItLikeItIs() があります。
- メイン メソッドには、さまざまな Day enum 値を使用し、それぞれに対して TellItLikeItIs() メソッドを呼び出す EnumTest のオブジェクトが含まれています。
注記: EnumTest は enum ではなく通常のクラスであるため、 new キーワードが使用されます。そのため、インスタンスを作成し、enum 値をそのコンストラクターに渡します。