enumのtoString()

JDK 5.0のenum。そのまま出力すると、定義名がそのまま出力されるんですが、
この振る舞いを変更できないのが気持ち悪い。

public class EnumSample {
    public static enum TYPE {A, B, C};
    public static void main(String[] args) {
        System.out.println(TYPE.A);
    }
}

上記プログラムは「A」と出力するが、これを変えるためには、
TYPEの中で、toString()をオーバーライドしてあげないといけない。
例えば、

public String toString() {
    return super.toString().toLowerCase();
}

というメソッドをTYPEに追加すれば出力結果は「a」になる。

ここまでは、まぁいいんだけど、こうしてしまうと、
自動的に作成される、valueOfが正しく動かなくなる。

TYPE.valueOf(TYPE.A.toString())==TYPE.A

が成立しないどころか例外が発生しやがるんだよね、これが。

Java 5.0 Tiger (開発者ノートシリーズ)
Java 5.0 Tiger (開発者ノートシリーズ)
によれば。。。

toString()の振る舞いを変更する場合、valueOf()の振舞いも変更する必要がある。
これらの2つのメソッドは常にペアの鏡像になる。

うん、そうだろうなぁ。わかるよ。
言いたいことは非常によくわかる。
でもね、、、

The enum EnumSample.TYPE already defines the method valueOf(String) implicitly

変更できないんだなこれがorz

シンメトリー性がないのがいやなので、enumで定義名以外の情報を
返す場合は、別途メソッドを作ってやってます。
不便だ。
mustangでなんとかしてくれると嬉しいのぉ。