2009-09-04 12 views
10

Para utilizar un ejemplo contribuido en Java, aquí está el código:En Java, ¿cuándo se invoca el constructor para una constante enumerada?

enum Commands{ 
    Save("S"); 
    File("F"); 

    private String shortCut; 
    private Commands(String shortCut){ this.shortCut = shortCut; } 
    public String getShortCut(){ return shortCut; } 
} 

Tengo el siguiente/código de piloto de pruebas:

public static void main(String args[]){ 
    System.out.println(Commands.Save.getShortCut()); 
} 

La pregunta es: En Java, cuando es el constructor de una constante enumerada invocada? En el ejemplo anterior, solo estoy usando la constante enumerada Save. ¿Esto significa que se llama al constructor una vez para crear Save solamente? ¿O ambos Save y File se construirán juntos independientemente?

Respuesta

11

Los constructores se invocan cuando se inicializa la clase enum. Se invocará cada constructor, en orden de declaración de miembro, independientemente de qué miembros se hagan referencia y se usen realmente.

+0

¿Eso significa que cuando 'ClassLoader' carga la clase, se invoca Constructor de enum? o ¿el miembro que accede como Save and File invocará al constructor? ¿Qué pasa si no hay un constructor de argumentos? –

+0

@MuhammadBabar Una clase se puede cargar sin inicializar. Entonces, no, significa que cuando la clase se inicializa, cada miembro se construye. Y, como dije, no importa si se hace referencia a un miembro; se construye cuando la clase se inicializa. Tu segunda pregunta no está clara. Si no se proporcionan argumentos para el miembro, debe haber un constructor no-arg definido, o la enumeración no se compilará. ¿Es eso lo que quieres decir? – erickson

+0

Pero en enum nunca hacemos un nuevo SomeEnum() es decir, ¡no hay una inicialización explícita! En mi caso, enum tiene una sola variable, es decir, * instancia * y un constructor privado sin argumentos. ¿Cuándo se llama este constructor? –

3

Al igual que el método static() {...}, los constructores se invocan cuando la clase Enum se inicializa por primera vez. Todas las instancias de Enum se crean antes de que se pueda usar alguna.

public static void main(String args[]){ 
    System.out.println(Commands.Save.getShortCut()); 
} 

En este ejemplo, el ctor tanto para Save y File habrá completado antes de Save.getShortCut() se invoca.

Se invocan secuencialmente, como se declara en el código.

2

Ambos se crearán en el tiempo de inicialización de la clase como otros dijeron. Me gustaría señalar que esto se hace antes de cualquier inicializador estático para que pueda usar estas enumeraciones en bloque estático.

Cuestiones relacionadas