Effective Java第二版でJavaの勉強中。
「項目 30 int定数の代わりに enum を使用する」にて紹介されている、
"enum型にデータと振る舞いを持たせる"コードを真似して書いてみた。
// 面積の単位ごとのデータ、メソッドを定義
private enum Unit {
HEIBEI ("㎡"){
String getArea(double area) {
return area + this.toString();
}
},
TSUBO ("坪"){
String getArea(double area) {
return area * 0.3025 + this.toString();
}
};
private final String unitName;
// コンストラクタ
Unit(String unitName) { this.unitName = unitName; }
// すべての定数にオーバーライドを強制する
abstract String getArea(double area);
// カスタム文字列表現
@Override
public String toString() {
return unitName;
}
// 一意の文字列表現から定数を取得できるようMap化しておく
private static final MapstringToEnum = new HashMap ();
static {
for (Unit unit : values())
stringToEnum.put(unit.toString(), unit);
}
// 一意の文字列表現から定数を取得する(toStringと対)
public Unit fromString(String unitName) {
return stringToEnum.get(unitName);
}
}
// 定義したenumを利用する
public static void main(String[] args) {
double area = 320.25;
System.out.println(Unit.HEIBEI.getArea(area));
System.out.println(Unit.TSUBO.getArea(area));
}
実行結果
320.25㎡
96.875625坪
これまでenum型については、
バッドプラクティスとして知られる"int enumパターン"(下記)の代用として定数を列挙する、ぐらいにしか使ったことがなかった。。
// No More int enum pattern!!
public static final int HEIBEI = 1;
public static final int TSUBO = 2;