Подтвердить что ты не робот

Не можете ссылаться на статическое поле enum в инициализаторе?

Я только что получил проект Java5 с этой ошибкой, я попытался использовать Java5 и Java6, но он все еще там. он работал как-то раньше (поскольку он был в svn), как я могу обойти эту ошибку компилятора?

4b9b3361

Ответ 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++;
    }
}