Java 列挙型(enum)
Java の列挙型は特別なクラスで、一般的に一組の定数を表します。例えば、1年の4つの季節、1年の12ヶ月、1週間の7日、方角には東西南北などがあります。
Java の列挙型クラスは enum キーワードを使用して定義し、各定数はカンマで,区切ります。
例えば、色の列挙型クラスを定義します。
enum Color
{
RED, GREEN, BLUE;
}
上記の列挙型クラス Color の色定数には RED、GREEN、BLUE があり、それぞれ赤、緑、青を表します。
使用例:
例
{
RED, GREEN, BLUE;
}
public class Test
{
// 実行して出力結果
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
上記のコードを実行すると、出力結果は次のようになります:
RED
内部クラスでの列挙型の使用
列挙型クラスは内部クラス内で宣言することもできます:
例
{
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 文を使用して列挙型要素を反復処理できます:
例
{
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 文で使用されます:
例
{
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() メソッドは、指定された文字列値の列挙定数を返します。
例
{
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 アクセス修飾子のみ使用できるため、外部から呼び出すことはできません。
列挙型は具体的なメソッドを含むことも、抽象メソッドを含むこともできます。列挙型クラスが抽象メソッドを持つ場合、列挙型クラスの各インスタンスはそれを実装する必要があります。
例
{
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その他の拡張