Не можете сослаться на статическое поле enum в инициализаторе? - PullRequest
42 голосов
/ 11 февраля 2009

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

Ответы [ 2 ]

80 голосов
/ 11 февраля 2009

Не «обходите» ошибку - она ​​не будет делать то, что вы хотите. Ошибка существует по уважительной причине.

Значения перечисления инициализируются перед любыми другими статическими полями. Если вы хотите сделать что-то вроде добавления всех значений в карту, сделайте это в статическом инициализаторе после всего остального:

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);
        }
    }
}
8 голосов
/ 14 ноября 2014

Другой способ «обойти» его, если вам нужен, например, счетчик или что-то, что нужно запускать при каждой инициализации, - это создать частный статический внутренний класс, например:

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++;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...