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