2014年5月2日金曜日

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

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;

0 件のコメント:

コメントを投稿