An enum is a special class representing a fixed set of constants. Enums were added in Java 5 and are the preferred way to define a closed set of values.

Basic Enum

  public enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.MONDAY;
System.out.println(today); // MONDAY
  

Enums implicitly extend java.lang.Enum and cannot extend other classes (but can implement interfaces).

Enum Methods

Every enum inherits useful methods from Enum:

  Day d = Day.WEDNESDAY;
System.out.println(d.name());        // WEDNESDAY
System.out.println(d.ordinal());     // 2
System.out.println(Day.valueOf("FRIDAY")); // FRIDAY

for (Day day : Day.values()) {
    System.out.println(day);
}
  

Enums with Fields and Constructors

  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;
    private final double radius;

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

    public double surfaceGravity() {
        return 6.67300E-11 * mass / (radius * radius);
    }

    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

double weight = Planet.EARTH.surfaceWeight(70);
  

Enum constructors are always private (or package-private) — you cannot call new Planet(...).

Enums with Abstract Methods

Each constant can override behavior:

  public enum Operation {
    PLUS("+") {
        public double apply(double x, double y) { return x + y; }
    },
    MINUS("-") {
        public double apply(double x, double y) { return x - y; }
    },
    TIMES("*") {
        public double apply(double x, double y) { return x * y; }
    };

    private final String symbol;

    Operation(String symbol) {
        this.symbol = symbol;
    }

    public abstract double apply(double x, double y);
}

double result = Operation.PLUS.apply(3, 4); // 7.0
  

EnumSet and EnumMap

Specialized collections optimized for enums:

  import java.util.EnumSet;
import java.util.EnumMap;

// EnumSet — fast, compact set of enum values
EnumSet<Day> weekdays = EnumSet.range(Day.MONDAY, Day.FRIDAY);
EnumSet<Day> weekend = EnumSet.of(Day.SATURDAY, Day.SUNDAY);

// EnumMap — array-backed map keyed by enum
EnumMap<Day, String> schedule = new EnumMap<>(Day.class);
schedule.put(Day.MONDAY, "Team meeting");
  

Switch with Enums

  switch (today) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY ->
        System.out.println("Workday");
    case SATURDAY, SUNDAY ->
        System.out.println("Weekend");
}
  

Best Practices

  • Use enums instead of public static final int constants
  • Add fields and methods when constants carry data or behavior
  • Use EnumSet and EnumMap instead of HashSet/HashMap for enum keys
  • Do not rely on ordinal() for business logic — it breaks if constants are reordered