枚举恒定的特定体
在 enum
中,可以为 enum
的特定常量定义特定行为,该行为将覆盖 enum
的默认行为,此技术称为常量特定主体。
假设三名钢琴学生 - 约翰,本和卢克 - 被定义为名为 PianoClass
的 enum
,如下:
enum PianoClass {
JOHN, BEN, LUKE;
public String getSex() {
return "Male";
}
public String getLevel() {
return "Beginner";
}
}
有一天,另外两个学生到达 - 丽塔和汤姆 - 性别(女性)和等级(中级)与之前的不匹配:
enum PianoClass2 {
JOHN, BEN, LUKE, RITA, TOM;
public String getSex() {
return "Male"; // issue, Rita is a female
}
public String getLevel() {
return "Beginner"; // issue, Tom is an intermediate student
}
}
所以简单地将新学生添加到常量声明中,如下所示,是不正确的:
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()); // prints Intermediate
System.out.println(rita.getSex()); // prints Female
定义内容特定主体的另一种方法是使用构造函数,例如:
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()); // Male
System.out.println(john.getGender()); // Male
System.out.println(jane.getGender()); // Female