Skip to main content
Advertisement

12.2 Enums (Enumerations)

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; // Invalid value — and NO ONE can stop it!

This approach has a critical flaw: assigning an invalid value like 5 is perfectly acceptable to the compiler, causing bugs that only surface silently at runtime.

2. Defining an Enum

// Defining a Season enum
public enum Season {
SPRING, SUMMER, FALL, WINTER
}
// Defining a Direction enum
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 a String)
System.out.println(today.ordinal()); // 1 (declaration index, starts from 0)

// Works seamlessly with switch statements
switch (today) {
case SPRING -> System.out.println("Warm Spring!");
case SUMMER -> System.out.println("Blazing Summer!");
case FALL -> System.out.println("Cool Autumn!");
case WINTER -> System.out.println("Freezing Winter!");
}
// Output: Blazing Summer!
}
}

4. Enums with Data and Methods

Enums can go far beyond simple named constants — each constant can carry its own unique 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; // Mass in kg
private final double radius; // Radius in meters

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

// Enum method (calculates 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());
}
}
}

Using Enums provides guaranteed type safety and dramatically improves code readability and maintainability.

Advertisement