Javaの列挙型
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 定数に基づいてさまざまなケースを処理できます。
Java import 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
メソッドとコンストラクターを含む列挙型
列挙型には、定数ごとに個別に実行されるコンストラクターとメソッドを含めることができます
Java enum 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 では、各定数が実装する必要がある抽象メソッドを宣言できます。
Java enum 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 定数をループします。
Java enum 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 定数に対する反復が可能になります。
Java import 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 値をそのコンストラクターに渡します。