Working with Enumerations

1. Defining Enums

Example: Basic enum

public enum Status { ACTIVE, INACTIVE, PENDING }
Status s = Status.ACTIVE;
PropertyDetail
Implicit superjava.lang.Enum
SingletonsOne instance per constant
ConstructorImplicitly private

2. Adding Fields to Enums

Example: Enum with fields

public enum Planet {
    EARTH(5.97e24, 6.37e6),
    MARS(6.42e23, 3.39e6);

    private final double mass, radius;
    Planet(double m, double r) { this.mass = m; this.radius = r; }
    public double surfaceGravity() { return 6.674e-11 * mass / (radius * radius); }
}
ConventionDetail
Fieldsfinal recommended
ConstructorCalled once per constant at class load

3. Adding Methods to Enums

Method TypeDetail
Instance methodSame body for all constants
Constant-specificOverride per constant in { } body
Static helpere.g., fromCode(int c)

4. Adding Constructors to Enums

RuleDetail
AccessImplicitly private
When calledAt class loading, for each constant
Cannot be publicCompile error

5. Using values() Method

MethodReturns
values()Array of all constants in declaration order
EnumSet.allOf(E.class)Set view (more efficient)

6. Using valueOf() Method

MethodBehavior
Status.valueOf("ACTIVE")Returns constant; throws IllegalArgumentException if absent
Case-sensitiveYes — must match exactly

7. Using ordinal() Method

AspectDetail
ReturnsZero-based position in declaration
CautionDon't persist — fragile to reordering
Warning: Use name() or a custom code field for serialization, not ordinal().

8. Implementing Interfaces in Enums

Example: Enum implements interface

interface Discount { double apply(double price); }
enum Tier implements Discount {
    BRONZE { public double apply(double p) { return p * 0.95; } },
    GOLD   { public double apply(double p) { return p * 0.85; } };
}
PatternUse
StrategyEach constant implements algorithm differently
Type tokenEnum used as keys in maps/registries

9. Using EnumSet Collections

Example: EnumSet

EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);
EnumSet<Day> workdays = EnumSet.complementOf(weekend);
EnumSet<Day> all = EnumSet.allOf(Day.class);
MethodUse
of(...)Specific constants
noneOf(E.class)Empty set
range(from, to)Inclusive range
ImplementationBit vector — extremely fast

10. Using EnumMap Collections

AspectDetail
Constructionnew EnumMap<>(Day.class)
StorageArray indexed by ordinal
PerformanceFaster than HashMap for enum keys
Iteration orderNatural enum order

11. Comparing Enums

ComparisonMethod
Equality== safe (singletons) or equals()
OrdercompareTo() uses ordinal
In switchUse unqualified constant names

12. Understanding Enum Singleton Pattern

Example: Enum singleton

public enum Config {
    INSTANCE;
    private final Properties props = loadProps();
    public String get(String key) { return props.getProperty(key); }
}
Config.INSTANCE.get("env");
BenefitDetail
Thread-safe initClass loader guarantees
Serialization-safeJVM ensures single instance
Reflection-safeCannot instantiate via reflection