在一个enum有可能定义的一个特定常数的特定的行为enum,其覆盖的默认行为enum,这种技术被称为恒定特定身体。
假设在enumnamed中定义了三个钢琴学生-John,Ben和Luke-PianoClass如下:
enum PianoClass { JOHN, BEN, LUKE; public String getSex() { return "Male"; } public String getLevel() { return "Beginner"; } }
有一天,另外两名学生-丽塔(Rita)和汤姆(Tom)-性别(女性)和水平(中级)与以前的不匹配:
enum PianoClass2 { JOHN, BEN, LUKE, RITA, TOM; public String getSex() { return "Male"; // 问题,丽塔是女性 } public String getLevel() { return "Beginner"; // 问题,汤姆是中学生 } }
因此,将新学生简单地添加到常量声明中,如下所示是不正确的:
PianoClass2 tom = PianoClass2.TOM; PianoClass2 rita = PianoClass2.RITA; System.out.println(tom.getLevel()); // prints Beginner -> wrong Tom's not a beginner System.out.println(rita.getSex()); // prints Male -> wrong Rita's not a male
可以为每个常量Rita和Tom定义特定的行为,这些PianoClass2行为将覆盖默认行为,如下所示:
enum PianoClass3 { JOHN, BEN, LUKE, RITA { @Override public String getSex() { return "Female"; } }, TOM { @Override public String getLevel() { return "Intermediate"; } }; public String getSex() { return "Male"; } public String getLevel() { return "Beginner"; } }
现在汤姆的水平和丽塔的性别都应该是:
PianoClass3 tom = PianoClass3.TOM; PianoClass3 rita = PianoClass3.RITA; System.out.println(tom.getLevel()); // 打印中级 System.out.println(rita.getSex()); // 版画女
定义内容特定主体的另一种方法是使用构造函数,例如:
enum Friend { MAT("Male"), JOHN("Male"), JANE("Female"); private String gender; Friend(String gender) { this.gender= gender; } public String getGender() { return this.gender; } }
和用法:
Friend mat = Friend.MAT; Friend john = Friend.JOHN; Friend jane = Friend.JANE; System.out.println(mat.getGender()); // 男 System.out.println(john.getGender()); // 男 System.out.println(jane.getGender()); // 女