2009-02-11 14 views
39

Acabo de recibir el proyecto Java5 que tiene este error, traté de usar Java5 y Java6, pero todavía está allí. funcionó de alguna manera antes (ya que estaba en svn), ¿cómo puedo evitar el error del compilador?¿No puede hacer referencia al campo enum estático dentro de un inicializador?

+0

podría ayudar a publicar su código que se erroring – tddmonkey

+0

podría dar un pequeño ejemplo de código de lo que estamos tratando ¿conseguir? –

+0

Perdón por esto, lo encontré a través de Google, pero parece funcionar cuando el campo final estático privado es de tipo primitivo. ¿Alguien tiene una idea de por qué? – Norswap

Respuesta

70

No "pase por alto" el error, no hará lo que usted desea. El error está ahí por una buena razón.

Los valores enum se inicializan antes que cualquier otro campo estático. Si quieres hacer algo como la adición de todos los valores en un mapa, hacerlo en un inicializador estático después todo lo demás:

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 - ¿sabes por qué este error no ocurre en Eclipse 3.3 pero lo hace en 3.4? – tddmonkey

+3

¿Hay alguna razón en el ejemplo anterior para usar 'Foo foo: EnumSet.allOf (Foo.class)' en lugar de 'Foo foo: Foo.values ​​()'? –

+1

@AbdullahJibaly: No realmente. Ellos son bastante equivalentes aquí, creo. –

6

Otra forma de "by-pass" que, si es necesario, por ejemplo, un contador o algo que debe ejecutarse en cada initalization, es crear una clase interna estática privada, así:

Cuestiones relacionadas