Javaの定数固有メソッド実装 -- enumにabstractメソッドを定義して定数に固有の振る舞いを実装する
タグ: java / 初版公開: 2014-02-13

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)
Joshua Bloch
ピアソンエデュケーション
売り上げランキング: 88,031