Я только что получил проект Java5 с этой ошибкой, я попытался использовать Java5 и Java6, но он все еще там. он работал как-то раньше (поскольку он был в svn), как я могу обойти эту ошибку компилятора?
Не можете ссылаться на статическое поле enum в инициализаторе?
Ответ 1
Не "обходите" ошибку - она не будет делать то, что вы хотите. Ошибка есть по уважительной причине.
Значения перечисления инициализируются перед любыми другими статическими полями. Если вы хотите сделать что-то вроде добавления всех значений в карту, сделайте это в статическом инициализаторе после всего остального:
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);
}
}
}
Ответ 2
Другой способ "обходить" его, если вам нужно, например, счетчик или что-то, что нужно запускать при каждой инициализации, заключается в создании частного статического внутреннего класса, например:
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++;
}
}