2009-02-11 2 views
39

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

+0

это может помочь опубликовать свой код, который erroring – tddmonkey

+0

Не могли бы вы предоставить небольшой образец кода, что вы пытаетесь достигать? –

+0

Извините, я нашел его через google, но, похоже, работает, когда частное статическое конечное поле является примитивным типом. У кого-нибудь есть идея, почему? – Norswap

ответ

70

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

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

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); 
     } 
    } 
} 
+0

Jon - Вы знаете, почему эта ошибка не встречается в Eclipse 3.3, но в 3,4? – tddmonkey

+3

Есть ли причина в примере выше для использования 'Foo foo: EnumSet.allOf (Foo.class)' вместо 'Foo foo: Foo.values ​​()'? –

+1

@AbdullahJibaly: Не совсем. Думаю, они здесь почти эквивалентны. –

6

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

Смежные вопросы