logblog

業界経験2年目のしがないWebエンジニアのブログです。

【Java】enumでキーからメッセージを取得する

用途

DBには0, 1, 2...みたいに数値で入っているけど画面にはそれぞれの値に対応した文字列を表示したい時ってあるでしょう。
そんな時にenumを使っていい感じにキー値から対応する文字列を取得する方法を記載します。

コード

CodeBase.java

public interface CodeBase {
	public Short getKey();
	
	public String getMessage();
}


CodeDifinition.java

public class CodeDifinition {
	public static <T extends Enum<T> & CodeBase> Optional<T> of(Short key, Class<T> enumClass) {
		return Optional.ofNullable(Stream.of(enumClass.getEnumConstants())
				.filter(enums -> enums.getKey() == key)
				.findFirst()
				.orElse(null));
	}
	
	public static <T extends Enum<T> & CodeBase> String toCodeMessage(Optional<T> type) {
		return type.isPresent() ? type.get().getMessage() : "unknown";
	}
}


Fruits.java

public enum Fruits implements CodeBase {
	APPLE((short) 0, "りんご"),

	ORANGE((short) 1, "オレンジ"),

	LEMON((short) 2, "レモン");
	
	private Short key;
	private String message;
	
	private Fruits(Short key, String message) {
		this.key = key;
		this.message = message;
	}

	@Override
	public Short getKey() {
		return key;
	}

	@Override
	public String getMessage() {
		return message;
	}

	public static Optional<Fruits> of(Short key) {
		return CodeDifinition.of(key, Fruits.class);
	}
	
	public static String toMessage(Short key) {
		final Optional<Fruits> type = Fruits.of(key);
		
		return CodeDifinition.toCodeMessage(type);
	}
}


Execute.java

public class Execute {
	public static void main(String[] args) {
		final Short num0 = 0;
		final Short num1 = 1;
		final Short num2 = 2;
		final Short num3 = 3;
		final List<Short> numList = Arrays.asList(num0, num1, num2, num3);
		
		final List<String> messageList = numList.stream()
				.map(num -> Fruits.toMessage(num))
				.collect(Collectors.toList());
		
		messageList.forEach(System.out::println);
	}
}


出力結果

りんご
オレンジ
レモン
unknown


他にいい方法あれば教えて頂きたいです。

おわり