復習日記

勤務時間内で理解できなかったことやつまづいたことをまとめていく予定。

enum

私が社会人になったときはjdk1.4からjdk5になって間もない頃で、

enumとかあんま知らなかったんですよね。

関わってたプロジェクトもjdk1.4でしたし。

しばらくjavaやってなくて、つい最近またjava触るようになった次第です。 (言い訳がましいですが)

enumは、なんとなく読めるっちゃ読めるんですが、コード書けない。

なので、ここらでenumについて、整理しとこうと思います。

やりたいこと

チームメンバーが以下のようなenumを定義してたんですが、

これの使い方(コードを指定してメッセージを取得する方法)がよく分からなかったのでアリマス。

package jp.co.raimus.sample;

public enum ResponseMsg {

    SUCCESS(0, "成功です。"),
    UNAUTHORIZED(1, "権限がありません。"),
    BAD_REQUEST(2, "リクエストパラメータが不正です。"),
    INTERNAL_SERVER_ERROR(3, "よくわからないサーバエラーです。");

    private int cd;

    private String msg;

    private ResponseMsg(int cd, String msg) {
        this.cd = cd;
        this.msg = msg;
    }

    public int getCd() {
        return cd;
    }

    public void setCd(int cd) {
        this.cd = cd;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}

enumのコードから値を取得するには、簡単にはできなくて、ユーティリティ作ってあげる必要があるそうです。

参考)今さら聞けない!4つのステップで理解するJavaの列挙型Enum http://maplesystems.co.jp/blog/all/programming/2690/

1.enumのインタフェースを作ります。
package jp.co.raimus.sample;

public interface IResponseMsg {

    public int getCd();

    public String getMsg();
}
2.enumに先ほど作ったインタフェースを実装します。
package jp.co.raimus.sample;

public enum ResponseMsg implements IResponseMsg{
    
    SUCCESS(0, "成功です。"),
    UNAUTHORIZED(1, "権限がありません。"),
    BAD_REQUEST(2, "リクエストパラメータが不正です。"),
    INTERNAL_SERVER_ERROR(3, "よくわからないサーバエラーです。");

    private int cd;
    private String msg;
    
    private ResponseMsg(int cd, String msg) {
        this.cd = cd;
        this.msg = msg;
    }

    public int getCd() {
        return cd;
    }

    public void setCd(int cd) {
        this.cd = cd;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
3.コードからメッセージを取得するユーティリティ作ります。
package jp.co.raimus.sample;

public class CdMsgUtil {
    public static <E extends IResponseMsg> String getMsg(Class<E> enumClass, int cd) {
        String msg = "";
        for (E e : enumClass.getEnumConstants()) {
            if (e.getCd() == cd) {
                msg = e.getMsg();
                break;
            }
        }
        return msg;
    }
}
4.動作確認
package jp.co.raimus.sample;

public class App 
{
    public static void main( String[] args )
    {
        int inputCd = 1;
        String outputMsg = CdMsgUtil.getMsg(ResponseMsg.class, inputCd);
        
        System.out.println( "inputCd = " + inputCd);
        System.out.println( "outputMsg = " + outputMsg);
        
    }
}

実行結果

inputCd = 1
outputMsg = 権限がありません。

まとめ

インタフェースとジェネリクス使って汎用的にenum操作できるようにしてるとこがミソらしいです。

classオブジェクトにgetConstructors()なんてメソッドがあったんですね。

コードからメッセージを取得する仕組みを作るだけならプロパティファイル使った方が良さげかなぁ。。