Enumのvalues()はフィールドのシャローコピー

コンパイラが生成する(?)、Enumのフィールドにある要素の配列の参照がそのまま帰ってくると思ったら、コピーされた別の配列が返ってくる。試したバージョンは6u7。

元の列挙型

public enum EnumTest {
        A, B, C
}

コンパイル、そしてjad

$ javac EnumTest.java
$ jad EnumTest.class
Parsing EnumTest.class... Generating EnumTest.jad

結果のうち該当部分だけ抜粋すると、

    public static EnumTest[] values()
    {
        return (EnumTest[])$VALUES.clone();
    }
...
    public static final EnumTest A;
    public static final EnumTest B;
    public static final EnumTest C;
    private static final EnumTest $VALUES[];

    static 
    {
        A = new EnumTest("A", 0);
        B = new EnumTest("B", 1);
        C = new EnumTest("C", 2);
        $VALUES = (new EnumTest[] {
            A, B, C
        });
    }

JREのtools.jarだと、System.arraycopy()を使ってるみたい(eclipseがコンパイルしたもので同様のことをすると、こうなる)

    public static EnumTest[] values()
    {
        EnumTest aenumtest[];
        int i;
        EnumTest aenumtest1[];
        System.arraycopy(aenumtest = ENUM$VALUES, 0, aenumtest1 = new EnumTest[i = aenumtest.length], 0, i);
        return aenumtest1;
    }
...
    public static final EnumTest A;
    public static final EnumTest B;
    public static final EnumTest C;
    private static final EnumTest ENUM$VALUES[];

    static
    {
        A = new EnumTest("A", 0);
        B = new EnumTest("B", 1);
        C = new EnumTest("C", 2);
        ENUM$VALUES = (new EnumTest[] {
            A, B, C
        });
    }

意味あるのかな、このコピー。