システム開発で思うところ

Java EEを主にシステム開発をしながら思うところをツラツラを綴る

Enumはlombokとの組み合わせで振舞いを簡単に実装できる

Enumはとても便利。

とはいっても、そのまま使うことは少ないです。

テーブルの値や、画面におけるセレクトボックスの値などシステムにおける具体的な値と同期をとって使うことが多いように思います*1


今回は、性別をEnumで表現して画面などで使用するコード値と文字列のペアを実装したいと思います。

lombokを使わない

MALE、FEMALEは定数フィールド名です。
codeにはテーブルにおけるコード値、propertyは画面表示に使用する文字列を定義している想定です。

package com.mycompany.samples.enumclass;

public enum GenderNoLombok {
    MALE(1, "男"),
    FEMALE(2, "女");

    private final int code;
    private final String property;

    private GenderNoLombok(int code, String property) {
	this.code = code;
	this.property = property;
    }

    public int getCode() {
	return this.code;
    }

    public String getProperty() {
	return this.property;
    }
}
Enumの使い方

Enumは比較に使うとコードの可読性が良くなりますし、アクセッサで必要な値を取得できます。
Enumの比較は==でもequalsでも、どちらでもできます。

実行ソース

public class Executer {

    public static void main(String args[]) {
	GenderNoLombok gender = GenderNoLombok.FEMALE;
	if (gender == GenderNoLombok.MALE) {
	    System.out.println("gender.getCode() = " + gender.getCode());
	    System.out.println("gender.getProperty() = " + gender.getProperty());
	} else {
	    System.out.println("gender.getCode() = " + gender.getCode());
	    System.out.println("gender.getProperty() = " + gender.getProperty());
	}
    }
}

実行結果

gender.getCode() = 2
gender.getProperty() = 女

lombokを使う

必要な定義とフィールドと実装して
@AllArgsConstructor @Getter をクラス宣言のところに追記するだけです。

package com.mycompany.samples.enumclass;

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor @Getter
public enum Gender {
    MALE(1, "男"),
    FEMALE(2, "女");

    private final int code;
    private final String property;
}

lombokを使ったものをdelombokで確認

package com.mycompany.samples.enumclass;

public enum Gender {
    MALE(1, "男"), FEMALE(2, "女");
    private final int code;
    private final String property;

    @java.lang.SuppressWarnings("all")
    @javax.annotation.Generated("lombok")
    private Gender(final int code, final String property) {
        this.code = code;
        this.property = property;
    }

    @java.lang.SuppressWarnings("all")
    @javax.annotation.Generated("lombok")
    public int getCode() {
        return this.code;
    }

    @java.lang.SuppressWarnings("all")
    @javax.annotation.Generated("lombok")
    public String getProperty() {
        return this.property;
    }
}

単純作業が1つ減るだけかもしれませんが、こういった積み重ねが地味に助かります。

次は、今回追加したような振舞いをinterfaceにして
汎用的なユーティリティを作ってみたいと思います。

*1:Yes/Noと言った二択といった単純な組み合わせであっても、No=0/Yes=1、Yes=0/No=1、どちらを良しとするか・・・。小さなことだけど、小さなことだからこそ、私は迷い始めたら手が止まってしまう妙なところがあります。