Enum as instance variables

LuckyLuke picture LuckyLuke · Aug 4, 2012 · Viewed 39.8k times · Source

If you have an enum such as

enum Coffee {
    BIG,
    SMALL
}

and a class that has an instance variable like this of the enum:

public class MyClass {
    private Coffee coffee;

    // Constructor etc.
}

Why is it possible in the constructor to say e.g. coffee.BIG? I don't understand that you can use the reference? Is enum as instance variables initialized to something other than null? It is the self test question #4 in the SCJP book in the first chapter. I tried to shorten the code and question.

Answer

Pshemo picture Pshemo · Aug 4, 2012

In

enum Coffee {
    BIG,
    SMALL
}

BIG or SMALL are public static final fields of Coffee class, and like all static fields they can be accessed by class name like

Coffee b1 = Coffee.BIG;

or by reference of same type as class, like

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

But lets remember that we should avoid accessing static members via references. This creates confusion since we are not really accessing members of instance but members of class (so for instance there is no polymorphic behaviour).