๐ŸŽ“ A1Learner
๐Ÿ”
0 of 40 lessons completed

Java Enums in Depth

An enum is a fixed set of named constants, and each constant can carry its own data. A constructor sets that data when the constant is made.

Constants carry a field

Each level carries a points value. The constructor sets it once per constant.

public class Main {
  public static void main(String[] args) {
    System.out.println(Level.LOW.points());
    System.out.println(Level.HIGH.points());
  }
}
enum Level {
  LOW(5),
  MEDIUM(10),
  HIGH(20);
  private final int points;
  Level(int points) {
    this.points = points;
  }
  int points() {
    return points;
  }
}

Values walk in declaration order

The values method answers every constant. The order matches the declaration.

public class Main {
  public static void main(String[] args) {
    for (Level level : Level.values()) {
      System.out.println(level);
    }
  }
}
enum Level {
  LOW(5),
  MEDIUM(10),
  HIGH(20);
  private final int points;
  Level(int points) {
    this.points = points;
  }
  int points() {
    return points;
  }
}

ValueOf finds a constant by name

The name text HIGH finds its constant. Its points value prints next.

public class Main {
  public static void main(String[] args) {
    Level level = Level.valueOf("HIGH");
    System.out.println(level);
    System.out.println(level.points());
  }
}
enum Level {
  LOW(5),
  MEDIUM(10),
  HIGH(20);
  private final int points;
  Level(int points) {
    this.points = points;
  }
  int points() {
    return points;
  }
}

Name and ordinal describe a constant

Name answers the constant text. Ordinal answers its position in the declaration.

public class Main {
  public static void main(String[] args) {
    Level level = Level.MEDIUM;
    System.out.println(level.name());
    System.out.println(level.ordinal());
    System.out.println(level.points());
  }
}
enum Level {
  LOW(5),
  MEDIUM(10),
  HIGH(20);
  private final int points;
  Level(int points) {
    this.points = points;
  }
  int points() {
    return points;
  }
}

Example

public class Main {
  public static void main(String[] args) {
    for (Level level : Level.values()) {
      System.out.println(level.name() + " gives " + level.points() + " points.");
    }
  }
}
enum Level {
  LOW(5),
  MEDIUM(10),
  HIGH(20);
  private final int points;
  Level(int points) {
    this.points = points;
  }
  int points() {
    return points;
  }
}

Key points

  • Each enum constant carries a field set by an enum constructor.
  • The values method walks all constants in declaration order.
  • The valueOf method finds a constant by its name text.
  • The name method answers the constant name text.
  • The ordinal method answers the constant position, starting at zero.

In this example, values walks every constant in order, and each line pairs its name with its carried points value.

Note

Ordinal is a position, not data, so code should not store it as meaning.

Try it Yourself

Edit the code, then press Run.

Running is simulated

Exercise

Level has constants LOW, MEDIUM and HIGH in that order. What does Level.MEDIUM.ordinal() answer?