2012-08-04 34 views
19

Jeśli masz enum takich jakEnum jako zmienne instancji

enum Coffee { 
    BIG, 
    SMALL 
} 

i klasa, która zawiera instancję zmiennej takiego z wyliczenia:

public class MyClass { 
    private Coffee coffee; 

    // Constructor etc. 
} 

Dlaczego jest to możliwe w konstruktora powiedz np coffee.BIG? Nie rozumiem, że możesz użyć odniesienia? Czy zmienne instancji są inicjowane na coś innego niż null? Jest to pytanie testowe nr 4 w książce SCJP w pierwszym rozdziale. Próbowałem skrócić kod i pytanie.

Odpowiedz

18

W

enum Coffee { 
    BIG, 
    SMALL 
} 

duże lub małe są public static final pola klasy kawy, i jak wszystkie statycznych pól mogą być dostępne poprzez nazwę klasy jak

Coffee b1 = Coffee.BIG; 

lub przez odniesienie do tego samego typu, co klasy , jak

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

Ale pamiętajmy, że powinniśmy unikać uzyskiwania dostępu do statycznych elementów poprzez referencje. Stwarza to zamieszanie, ponieważ tak naprawdę nie mamy dostępu do członków instancji instancji, ale członków klasy (więc na przykład nie ma polimorficznych zachowań).

5

Przed wprowadzeniem języka Java 5 sposobem na wdrożenie wyliczeń było utworzenie klasy z prywatnym konstruktorem i publicznymi polami końcowymi tej samej klasy, zainicjowanymi dla określonych wartości.

Ponieważ Java 5, enum konstrukt jest faktycznie cukier, który robi to samo, i dba o takie rzeczy jak wartości null nie są dozwolone wartości enum stać pola publiczne statyczne itp

12

To co się dzieje Za sceny:

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 {}; 
} 

Jak widać BIG i SMALL są zasadniczo pola statyczne twojej wyliczenia.

JLS również tę część jasne:

Oprócz członków, że typ enum E dziedziczy z Enum, dla każdego zadeklarowane enum stałą o nazwie n, typ enum ma bez zastrzeżeń zadeklarowane publiczne statyczne pole końcowe o nazwie n typu E. Te pola są uznawane za zadeklarowane w tej samej kolejności co odpowiadające im stałe wyliczeniowe , zanim jakiekolwiek statyczne pola jawnie zostaną zadeklarowane w typie wyliczeniowym. Każde takie pole jest inicjowane na stałą enum, która mu odpowiada.

Mam nadzieję, że to wyjaśnia twoje pytanie.