BohYoh.comトップページへ
Java FAQ
目次

列挙とは何ですか。

 列挙は、とりうる値の集合を現します。
 拡張された整数でしかない他の言語の列挙に比べると、Javaの列挙は非常に強力で多機能です。その理由は、内部的に《クラスとして実装される》からです。
 たとえば、季節を表すための、非常に単純な列挙

enum Season { SPRING, SUMMER, AUTUMN, WINTER };

は、以下のようにコンパイルされます(このようなコードを書くことはできません)。

final class Season extends Enum<Season> { public static final Season[] values() { return (Season[])$VALUES.clone(); } public static Season valueOf(String s) { return (Season)Enum.valueOf(Season, s); } private Season(String s, int i) { super(s, i); } public static final Season SPRING; public static final Season SUMMER; public static final Season AUTUMN; public static final Season WINTER; private static final Season $VALUES[]; static { SPRING = new Season("SPRING", 0); SUMMER = new Season("SUMMER", 1); AUTUMN = new Season("AUTUMN", 2); WINTER = new Season("WINTER", 3); $VALUES = (new Season[] { SPRING, SUMMER, AUTUMN, WINTER }); } }

 列挙は、java.lang.Enumを拡張したサブクラスとしてコンパイルされます。
 そのため、各列挙定数を表す序数(宣言順に割り振られた連番0, 1, 2, …)はordinalメソッドによって調べることができ、列挙型の値が宣言順にすべて含まれた配列はvaluesメソッドによって取得できます。
 nameメソッドとtoStringメソッドは、ともにnameフィールドの値を返します。ただし、nameメソッドがfinal宣言されていてオーバライドできまないのに対し、toStringメソッドはオーバライドできます。
 列挙には、メソッドやフィールドを自由に追加したり、インタフェースをインプリメントしたりすることができますので拡張性も優れています。


戻る

BohYoh.comロゴ