web-dev-qa-db-ja.com

イニシャライザ内の静的列挙型フィールドを参照できませんか?

このエラーのあるJava5プロジェクトを入手しました。Java5とJava6を使用してみましたが、まだあります。以前はどういうわけか(svnにあったので)動作しましたが、どうすればそのコンパイラエラーを回避できますか?

44
IAdapter

エラーを「バイパス」しないでください-それはあなたが望むことをしません。エラーは正当な理由であります。

列挙値は、他の静的フィールドの前に初期化されます。すべての値をマップに追加するようなことをしたい場合は、静的初期化子でそれを行いますafterその他すべて:

import Java.util.*;

public enum Foo
{
    BAR, BAZ;

    private static final Map<String, Foo> lowerCaseMap;

    static
    {
        lowerCaseMap = new HashMap<String, Foo>();
        for (Foo foo : EnumSet.allOf(Foo.class))
        {
            // Yes, use some appropriate locale in production code :)
            lowerCaseMap.put(foo.name().toLowerCase(), foo);
        }
    }
}
81
Jon Skeet

たとえば、カウンターなど、各初期化で実行する必要があるものが必要な場合、それを「バイパス」する別の方法は、次のようにプライベート静的内部クラスを作成することです。

public enum Foo {
    BAR, BAZ;

    private static final class StaticFields {
        private static final Map<String, Foo> lowerCaseMap = new HashMap<>();
        private static int COUNTER = 0;
    }

    private Foo() {
        StaticFields.lowerCaseMap.put(this.name().toLowerCase(), this);
        StaticFields.COUNTER++;
    }
}
8
Luan Nico