このエラーのあるJava5プロジェクトを入手しました。Java5とJava6を使用してみましたが、まだあります。以前はどういうわけか(svnにあったので)動作しましたが、どうすればそのコンパイラエラーを回避できますか?
エラーを「バイパス」しないでください-それはあなたが望むことをしません。エラーは正当な理由であります。
列挙値は、他の静的フィールドの前に初期化されます。すべての値をマップに追加するようなことをしたい場合は、静的初期化子でそれを行います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);
}
}
}
たとえば、カウンターなど、各初期化で実行する必要があるものが必要な場合、それを「バイパス」する別の方法は、次のようにプライベート静的内部クラスを作成することです。
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++;
}
}