On this page
Enums
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 intconstants - Add fields and methods when constants carry data or behavior
- Use
EnumSetandEnumMapinstead ofHashSet/HashMapfor enum keys - Do not rely on
ordinal()for business logic — it breaks if constants are reordered