Skip to content

6.4. Enumerations

An enumeration (enum) is a special data type that enables a variable to be a set of predefined constants. Enums make code more readable and maintainable by replacing magic numbers and strings with meaningful names.

Basic Enum Declaration

java
// Simple enum definition
public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

public enum Priority {
    LOW, MEDIUM, HIGH, URGENT
}

Using Enums

java
public class EnumExample {
    public static void main(String[] args) {
        // Enum variable declaration and assignment
        Day today = Day.MONDAY;
        Priority taskPriority = Priority.HIGH;

        // Using enums in switch statements
        switch (today) {
            case MONDAY:
                System.out.println("Start of work week");
                break;
            case FRIDAY:
                System.out.println("Weekend is near!");
                break;
            default:
                System.out.println("Regular day");
        }

        // Comparing enum values
        if (taskPriority == Priority.HIGH) {
            System.out.println("This task requires immediate attention");
        }
    }
}

Enums with Fields and Methods

java
public enum Planet {
    // Enum constants with parameters
    MERCURY(3.303e+23, 2.4397e6),
    VENUS(4.869e+24, 6.0518e6),
    EARTH(5.976e+24, 6.37814e6),
    MARS(6.421e+23, 3.3972e6),
    JUPITER(1.9e+27, 7.1492e7),
    SATURN(5.688e+26, 6.0268e7),
    URANUS(8.686e+25, 2.5559e7),
    NEPTUNE(1.024e+26, 2.4746e7);

    // Fields
    private final double mass;   // in kilograms
    private final double radius; // in meters

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

    // Methods
    public double getMass() {
        return mass;
    }

    public double getRadius() {
        return radius;
    }

    public double getSurfaceGravity() {
        final double G = 6.67300E-11; // gravitational constant
        return G * mass / (radius * radius);
    }

    public double getSurfaceWeight(double otherMass) {
        return otherMass * getSurfaceGravity();
    }
}

Advanced Enum Features

java
public enum Operation {
    // Each constant has associated behavior
    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; }
    },
    DIVIDE("/") {
        public double apply(double x, double y) { return x / y; }
    };

    private final String symbol;

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

    // Abstract method - each constant must implement
    public abstract double apply(double x, double y);

    @Override
    public String toString() {
        return symbol;
    }
}

Enum Utility Methods

java
public class EnumUtilities {
    public static void main(String[] args) {
        // Getting all enum values
        Day[] days = Day.values();
        for (Day day : days) {
            System.out.println(day);
        }

        // Getting enum from string
        Day monday = Day.valueOf("MONDAY");

        // Getting enum name and ordinal
        System.out.println("Name: " + monday.name());      // MONDAY
        System.out.println("Ordinal: " + monday.ordinal()); // 1

        // Comparing enums
        System.out.println(Day.MONDAY.compareTo(Day.FRIDAY)); // negative number
    }
}

Enum Best Practices

  1. Use for fixed sets of constants
  2. Implement with methods for behavior
  3. Use in switch statements for readability
  4. Consider implementing interfaces for additional functionality