読者です 読者をやめる 読者になる 読者になる

valid,invalid

関心を持てる事柄について

enum型にデータと振る舞いを持たせる

Java Effective Java

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 Map stringToEnum = 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;