列挙型で選択された値を扱う
今までJavaを使っていて非常に厄介だったのが「複数の選択肢の中から1つを選ぶ」という処理です。実をいえば、Javaではこれができなかったのです。「えっ、そんなわけない」って? ではやってみましょう。
public class Main {
public static void main(String[] args) {
String n = MyData.get(0);
if (n.equals("A")){
System.out.println("you select A.");
} else if (n.equals("B")){
System.out.println("Bですね。");
} else {
System.out.println("END...");
}
}
}
class MyData {
private static String[] data = new String[]{"A","B","C"};
public static String get(int n) {
return data[n];
}
}
例えば、こんな感じのものを考えてみましょう。MyDataには3つの要素を持つ配列がフィールドにあり、getによって何番目のものかを取り出します。mainでは、MyData.getで任意の値を取り出し、その値によって異なる処理をさせます。
このとき、MyData.get(10)というように要素数を超える値を指定してしまったらどうなるでしょうか。困りますね。これを防ぐために、getメソッドの中にさまざまな状況に応じたエラー処理を用意してやる必要が生じます。要するに、そういうことなのです。「複数の値の中から1つだけを選ぶ」ということは、Javaではできないのです。選んではいけないものを選んでしまったときの処理をあれこれ用意することで、擬似的にそれと同じようなことをさせることしかできなかったのです。
このようなやり方では、エラー処理が不完全だったりすると途端にバグにつながってしまいます。Java自体に「複数の値から1つだけを選ぶ、それ以外は絶対に選べない」というような仕組みがあれば、こんな面倒なことはしなくて済むのです。
そこで用意されたのが「列挙型」と呼ばれるものです。これは、以下のような形で宣言をします。
enum 型名 { 値1,値2,値3,……};
このようにして宣言すると、この型に用意されている値しか使えない特別な型を作成することができます。これを使うとどんな便利なことがあるのか、ちょっとやってみましょう。
public class Main {
enum MYDATA {A,B,C};
public static void main(String[] args) {
MYDATA n = MYDATA.B;
switch (n){
case A:
System.out.println("you select A.");
break;
case B:
System.out.println("Bですね。");
break;
case C:
System.out.println("END...");
}
}
}
もうMyDataクラスなんて要りません。ここでは、enum MYDATA {A,B,C};として、A,B,Cの3つの要素しかない列挙型MYDATAを定義しています。このMYDATA型の変数には、MYDATA内の要素しか収めることができません。MYDATA n = MYDATA.B;というようにして、必ずMYDATA内のいずれかの値を指定しなければいけないのです。
また、列挙型の値はswitch構文で値をチェックすることができます。MYDATA.Aの値の処理ならば、case A:とするだけで処理を用意できるのです。これまた、列挙型を使うとソースコードが実にシンプルになることがわかりますね。