enum型の定義方法は C言語と同じで次のように記述する。 Java の場合、列挙定数は一般的には大文字(MON, TUE, ...)使われるが[3]、小文字であっても問題はない。
enum Week { Mon, Tue, Wed, Thu, Fri, Sat, Sun };
上記の場合、Mon、Tue、...、Sun には順に 0, 1, ... , 6 が割り当てられる。
C言語の場合、
enum Week { Mon=1, Tue, Wed, Thu, Fri, Sat=11, Sun };とすれば、Mon=1、Tue=2、...、Fri=5、 Sat=11、 Sun=12 となるが[4]、 Java の場合、そのような仕様にはなっていない。
次のように、フィールドを使えば、似たことができる[3]。
public enum Week { Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(11), Sun(12); private int id; // フィールドの定義 private Fruit(int id) { // コンストラクタの定義 this.id = id; } }
序数(0, 1, 2, ... は ordinalメソッド、名称 "Mon", "Tue", ... は nameメソッドで得られる。
switch (week) { case Mon: System.out.printf("%d: %s\n", week.ordinal(), week.name()); break; // 0: Mon // 中略 case Sun: System.out.printf("%d: %s\n", week.ordinal(), week.name()); break; // 6: Sun } // week は Mon~Sun までの値しか取り得ないので default文はいらない
文字列から enum型を得るには次のようにする。
Week w = Week.valueOf("Tue"); // w は Week.Tue となる
列挙子が多い場合、ハッシュ表を使うのであろうか? パフォーマンスがちょっと気になる。いずれ確認する。