2012-08-04 14 views
19

Si usted tiene una enumeración comoEnum como variables de instancia

enum Coffee { 
    BIG, 
    SMALL 
} 

y una clase que tiene una variable de instancia como esta de la enumeración:

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

¿Por qué es posible en el constructor de decir, por ejemplo coffee.BIG? No entiendo que pueda usar la referencia? ¿Es enum como variables de instancia inicializadas a algo que no sea null? Es la pregunta de auto prueba n. ° 4 en el libro de SCJP en el primer capítulo. Intenté acortar el código y la pregunta.

Respuesta

18

En

enum Coffee { 
    BIG, 
    SMALL 
} 

grande o pequeño son public static final campos de la clase de café, y como todos los campos estáticos que pueden ser accedidos por nombre de la clase como

Coffee b1 = Coffee.BIG; 

o por referencia de mismo tipo que la clase , como

Coffee s2 = b1.SMALL; 
Coffee s3 = Coffee.BIG.SMALL; //BIG is reference of type Coffee so it is OK (but looks strange) 

Pero recordemos que debemos evitar el acceso a miembros estáticos a través de las referencias. Esto crea confusión ya que no estamos realmente accediendo a los miembros de la instancia , sino a los miembros de la clase (por ejemplo, no hay comportamiento polimórfico).

5

Antes de Java 5, la forma de implementar enums era crear una clase con constructor privado y campos finales públicos de la misma clase inicializados con valores específicos.

Desde Java 5, construcción de enumeración es efectivamente un azúcar que hace lo mismo, y se ocupa de cosas como los valores nulos no están permitidos, los valores de enumeración se convierten en campos estáticos públicos etc.

12

Esto es lo que sucede detrás de la escenas:

E:\workspace>type Coffee.java 
public enum Coffee { 
    BIG, 
    SMALL 
} 

E:\workspace>javap Coffee 
Compiled from "Coffee.java" 
public final class Coffee extends java.lang.Enum<Coffee> { 
    public static final Coffee BIG; 
    public static final Coffee SMALL; 
    public static Coffee[] values(); 
    public static Coffee valueOf(java.lang.String); 
    static {}; 
} 

como se puede ver BIG y SMALL son esencialmente los campos estáticos en su enumeración.

El JLS también hacen de esta parte clara:

Además de los miembros de que un tipo de enumeración E hereda de Enum, para cada declarada enumeración constante con el nombre de n, el tipo de enumeración tiene un implícitamente declarado campo final estático público denominado n del tipo E. Estos campos se consideran declarados en el mismo orden que las constantes de enumeración correspondientes, antes de declarar explícitamente campos estáticos en el tipo enum. Cada campo se inicializa a la constante enum que le corresponde.

Espero que esto aclare su pregunta.

Cuestiones relacionadas