疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【Java】enumの利用

今回はenumを使ってみます。
私も現場に出て初めて存在を知りました。

まずenumってなんだ?っていうところから。
enumとは一言で言うと列挙型です。
いや列挙型とか言われても・・・ってなりますよね。
簡単に言うと定数を列挙して用意しておけるということです。

使用例を見ていきます。
まずはenumから。

Human.java

public enum Human {
	TARO("太郎", 175, 65),
	HANAKO("花子", 155, 43);

	private String name;
	private int height;
	private int weight;

	private Human(String name, int height, int weight) {
		this.name = name;
		this.height = height;
		this.weight = weight;
	}

	private String getName() {
		return name;
	}

	private int getHeight() {
		return height;
	}

	private int getWeight() {
		return weight;
	}

	public static int getHeight(String name) {
		Human[] humans = Human.values();
		for(Human human : humans) {
			if(human.getName().equals(name)) {
				return human.getHeight();
			}
		}
		return 0;
	}

	public static int getWeight(String name) {
		Human[] humans = Human.values();
		for(Human human : humans) {
			if(human.getName().equals(name)) {
				return human.getWeight();
			}
		}
		return 0;
	}
}

ちょっと長くなりましたがこんな感じです。
メソッドを追ってもらえれば何となくわかるかもしれません。
nameをキーにheigthとweighjtを取得できそうです。

enumにはprivateなフィールドとコンストラクタが必須です。
そしてコンストラクタは定義したフィールドに相当する引数を持つ必要があります。
その上でgetterを用意することでenumとして機能するようになります。

そして以下がenumを実際に使用したクラスです。

Study.java

public class Study {
	public static void main(String[] args) {
		String human1 = "太郎";
		System.out.println(human1 + "の身長は" + Human.getHeight(human1) + "cm");
		System.out.println(human1 + "の体重は" + Human.getWeight(human1) + "kg");
	}
}

実行結果

太郎の身長は175cm
太郎の体重は65kg

ちゃんと定数を表示できています。
もちろん引数に渡しているhuman1が花子であれば、花子の身長や体重の値を取得します。

今回のような、Stringをキーにintを取得するような場合はマッチしなかった場合0を返していますが、それが正しいのかはわかりません。
例えばintをキーにStringを持ってくる場合はnullを返せばいいと思うんですけど。
Integerにして同じようにnullを返せば良いんですかね。


あとはenumはこういう記述もできるみたいです。

Human.java

import java.util.HashMap;
import java.util.Map;

public enum Human {
	TARO("太郎", 175, 65),
	HANAKO("花子", 155, 43);

	private String name;
	private int height;
	private int weight;

	private Human(String name, int height, int weight) {
		this.name = name;
		this.height = height;
		this.weight = weight;
	}

	private static final Map<String, Integer> heightMap = new HashMap<String, Integer>();
	private static final Map<String, Integer> weightMap = new HashMap<String, Integer>();

	static {
		for(Human entry : Human.values()) {
			heightMap.put(entry.getName(), entry.getHeight());
			weightMap.put(entry.getName(), entry.getWeight());
		}
	}

	private String getName() {
		return name;
	}

	private int getHeight() {
		return height;
	}

	private int getWeight() {
		return weight;
	}

	public static int getHeight(String name) {
		return heightMap.get(name);
	}

	public static int getWeight(String name) {
		return weightMap.get(name);
	}
}

先ほどのenumと比べてMapの定数を定義し、そのMapに対してキーから値を取得しています。
コードだけで見ればこちらの方がすっきりしていますね。

今回は以上になります。