Ответ 1
Проверьте спецификацию языка Java, третье издание, раздел 8.9 на http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.9
Это ошибка времени компиляции для ссылки на статическое поле типа перечисления это не константа времени компиляции (§15.28) от конструкторов, блоки инициализатора экземпляра, или инициализатор переменной экземпляра выражения этого типа. Это ошибка времени компиляции для конструкторы, блоки инициализатора экземпляра или переменная экземпляра выражения инициализатора константы enum en для ссылки на себя или на константу перечисления того же типа, которая объявляется справа от e.
Обсуждение
Без этого правила явно разумный код не будет работать во время выполнения из-за крутизны инициализации, присущей типам перечислений. (A круглость существует в любом классе с "самонастраиваемым" статическим полем.) Ниже приведен пример кода, который не срабатывает:
enum Color {
RED, GREEN, BLUE;
static final Map<String,Color> colorMap =
new HashMap<String,Color>();
Color() {
colorMap.put(toString(), this);
}
}
Статическая инициализация этого типа перечисления вызовет NullPointerException, потому что статическая переменная colorMap неинициализируется, когда выполняются конструкторы для констант перечисления. ограничение выше гарантирует, что такой код не будет компилироваться.