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、どちらを良しとするか・・・。小さなことだけど、小さなことだからこそ、私は迷い始めたら手が止まってしまう妙なところがあります。