//-------------------------------------------------------------- // Let's consider a class representing a character in a D&D style // adventure game: //-------------------------------------------------------------- public class Character { private final String race;// "DWARF", "ELF", "HUMAN" public Character(String race) { this.race = race; } public void warCry() { switch (race) { case "DWARF": System.out.println("I will smash your knees!"); break; case "ELF": System.out.println("My ears are pointy!"); break; case "HUMAN": System.out.println("Raar!"); break; default: System.out.println("No war cry defined."); } } } //-------------------------------------------------------------- // Problem: using a String to represent the race is error-prone. // We should be using enumerated types! //-------------------------------------------------------------- public enum Race { DWARF, HUMAN, ELF } public class Character { private final Race race; public Character(Race race) { this.race = race; } public void warCry() { switch (race) { case DWARF: System.out.println("I will smash your knees!"); break; case ELF: System.out.println("My ears are pointy!"); break; case HUMAN: System.out.println("Raar!"); break; default: System.out.println("No war cry defined."); } } } //-------------------------------------------------------------- // In Java, enums are classes. They can have methods, instance // variables etc. We might want to add additional functionality to // our Race enum like the following: // -------------------------------------------------------------- public enum Race { DWARF(4.0, 4.5), HUMAN(5.0, 5.5), ELF(6.0, 6.5); // ordered by height. private final double minHeight; private final double maxHeight; private Race2(double minHeight, double maxHeight) { this.minHeight = minHeight; this.maxHeight = maxHeight; } public double getMinHeight() { return minHeight; } public double getMaxHeight() { return maxHeight; } public boolean inHeightRange(double height) { return height >= minHeight && height <= maxHeight; } public static Race raceFromHeight(double height) { for (Race curRace : Race2.values()) { if (curRace.inHeightRange(height)) { return curRace; } } return null; } }