Javaのenumは特殊なクラスであり、enumにメソッドを定義することができる。では、そのメソッドをabstractにしたらどうなるだろうか? 実はenumに定義したabstractメソッドは、定数でオーバーライドすることになる。
これを利用すると定数による場合分けなしで、定数に固有の振る舞いを実装できる。この実装は定数固有メソッド実装(constant-specific method implementation)と呼ばれる。
以下は演算子を表すenumに、その演算子を使った計算を適用するapply
メソッドを実装した例である。
public enum operator {
PLUS{
@Override
double apply(double v0, double v1) {
return v0 + v1;
}
},
MINUTS{
@Override
double apply(double v0, double v1) {
return v0 - v1;
}
},
TIMES{
@Override
double apply(double v0, double v1) {
return v0 * v1;
}
},
DIVIDE{
@Override
double apply(double v0, double v1) {
return v0 / v1;
}
};
abstract double apply(double v0, double v1);
}
このenumは以下のように利用できる。
operator.PLUS.apply(1, 2); //=> 3.0
operator.MINUS.apply(1, 2); //=> -1.0
operator.TIMES.apply(1, 2); //=> 2.0
operator.DIVIDE.apply(1, 2); //=> 0.5
定数固有メソッド実装は、定数による場合分けを利用した実装より、enumを追加した際に実装の追加を忘れてしまうことを避けられる点で優れている。JavaのenumについてはEffective Javaの項目30が詳しい。
Effective Java 第2版 (The Java Series)
posted with amazlet at 13.12.07
Joshua Bloch
ピアソンエデュケーション
売り上げランキング: 88,031
ピアソンエデュケーション
売り上げランキング: 88,031