The syntax of the switch statement is extended ever-so-slightly. The type of the Expression is now permitted to be an enum class. (Note that java.util.Enum is not an enum class.) A new production is added for SwitchLabel:
SwitchLabel: case EnumConst : EnumConst: IdentifierThe Identifier must correspond to one of UNQUALIFIED enumeration constants.
Here is a slightly more complex enum declaration for an enum type with an explicit instance field and an accessor for this field. Each member has a different value in the field, and the values are passed in via a constructor. In this example, the field represents the value, in cents, of an American coin.
public enum Coin { PENNY(1), NICKEL(5), DIME(10), QUARTER(25); Coin(int value) { this.value = value; } private final int value; public int getValue() { return value; } }Switch statements are useful for simulating the addition of a method to an enum type from outside the type. This example "adds" a color method to the Coin class, and prints a table of coins, their values, and their colors.
import static java.lang.System.out; public class CoinTest { public static void main(String[] args) { for (Coin c : Coin.values()) { out.println(c + ": \t" + c.getValue() + "c \t" + color(c)); } } private enum CoinColor { COPPER, NICKEL, SILVER } private static CoinColor color(Coin c) { if (c == null) { throw new NullPointerException(); } switch (c) { // case Coin.PENNY: {} // Compile error! Must be UNQUALIFIED !!! case PENNY: return CoinColor.COPPER; case NICKEL: return CoinColor.NICKEL; case DIME: return CoinColor.SILVER; case QUARTER: return CoinColor.SILVER; // case 2: {} // Compile error !!! // Type mismatch: cannot convert from int to Coin } throw new AssertionError("Unknown coin: " + c); } }Running the program prints:
PENNY: 1c COPPER NICKEL: 5c NICKEL DIME: 10c SILVER QUARTER: 25c SILVER