実際、Java の Enum は、クラス階層全体を宣言するための構文糖衣にすぎません。
書き込み:
public enum MyEnum {
FOO, BAR
}
書くこととほぼ同じです
public abstract class MyEnum {
public static final MyEnum FOO = new MyEnum(){};
public static final MyEnum BAR = new MyEnum(){};
private MyEnum(){}
}
最初はやり過ぎに思えるかもしれませんが、次のようなクラスで実行できるすべてのことを実行できることに気付きます。
public enum Operators {
ADD("+"){
public double apply(double lhs, double rhs){ return lhs + rhs; }
},
SUBTRACT("-"){
public double apply(double lhs, double rhs){ return lhs - rhs; }
},
MULTIPLY("*"){
public double apply(double lhs, double rhs){ return lhs * rhs; }
},
DIVIDE("/"){
public double apply(double lhs, double rhs){ return lhs / rhs; }
};
private final String symbol;
Operators(String symbol){
this.symbol = symbol;
}
public abstract double apply(double lhs, double rhs);
}
これは次のものと同等になりました(さらにいくつかの便利なメソッドが追加されました):
public abstract class Operators {
public static final Operators ADD = new Operators("+"){
public double apply(double lhs, double rhs){ return lhs + rhs; }
};
public static final Operators SUBTRACT = new Operators("-"){
public double apply(double lhs, double rhs){ return lhs - rhs; }
};
public static final Operators MULTIPLY = new Operators("*"){
public double apply(double lhs, double rhs){ return lhs * rhs; }
},
public static final Operators DIVIDE = new Operators("/"){
public double apply(double lhs, double rhs){ return lhs / rhs; }
};
private final String symbol;
private Operators(String symbol){
this.symbol = symbol;
}
public abstract double apply(double lhs, double rhs);
}
これは、非常に基本的な C バージョンよりもはるかに強力です。そしてもちろん、列挙型では、列挙型の各メンバーがシングルトンであることが保証されています。