Skip to main content

12.2 Enumerations (Enum)

An Enum (Enumeration) is a special Java type that groups a set of related constants together into a single class-like entity. It was introduced in Java 5.

1. Why Do We Need Enums?

Without enums, "seasons" in a program used to be represented as plain integer constants:

// The old way (problematic!)
final int SPRING = 1;
final int SUMMER = 2;
final int FALL = 3;
final int WINTER = 4;

int season = 5; // Nothing stops this invalid value!

This approach has a serious flaw: assigning 5 to season — an invalid value — will not be caught by the compiler.

2. Defining an Enum

// Season enumeration
public enum Season {
SPRING, SUMMER, FALL, WINTER
}
// Direction enumeration
public enum Direction {
NORTH, SOUTH, EAST, WEST
}

3. Using an Enum

public class EnumExample {
public static void main(String[] args) {
Season today = Season.SUMMER;
System.out.println(today); // SUMMER
System.out.println(today.name()); // "SUMMER" (as String)
System.out.println(today.ordinal()); // 1 (declaration index, starts at 0)

// Works perfectly with switch statements
switch (today) {
case SPRING -> System.out.println("Warm spring!");
case SUMMER -> System.out.println("Hot summer!");
case FALL -> System.out.println("Cool autumn!");
case WINTER -> System.out.println("Cold winter!");
}
// Output: Hot summer!
}
}

4. Enums with Data and Methods

Enums can go beyond simple constant names — each constant can carry its own data and methods:

public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6);

private final double mass; // kg
private final double radius; // meters

// Enum constructor
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}

// Enum method — calculate surface gravity
public double surfaceGravity() {
final double G = 6.67300E-11;
return G * mass / (radius * radius);
}
}

public class PlanetTest {
public static void main(String[] args) {
for (Planet p : Planet.values()) {
System.out.printf("%-8s: gravity = %.2f%n", p, p.surfaceGravity());
}
}
}

5. Enum Methods and Utilities

// values() — returns all constants as an array
for (Season s : Season.values()) {
System.out.println(s.ordinal() + ": " + s.name());
}

// valueOf() — get constant by name
Season summer = Season.valueOf("SUMMER");
System.out.println(summer); // SUMMER

// Enum in collections
import java.util.EnumSet;
import java.util.EnumMap;

EnumSet<Season> warmSeasons = EnumSet.of(Season.SPRING, Season.SUMMER);
System.out.println(warmSeasons.contains(Season.SUMMER)); // true

EnumMap<Season, String> clothes = new EnumMap<>(Season.class);
clothes.put(Season.SUMMER, "T-shirt");
clothes.put(Season.WINTER, "Coat");
System.out.println(clothes.get(Season.SUMMER)); // T-shirt

Enums provide type safety(only valid constants can be assigned), greatly improving code readability and maintainability compared to integer constants.