1. 枚举类与普通类一样,一个java文件中只能定义一个public的枚举类,且此枚举类名必须和java文件名同名。枚举类默认继承java.lang.Enum类,而不是Object类。Enum类实现了Serializable接口和Comparable接口。
2. 枚举类的构造器只能使用private访问控制符。如不指定,则默认是private的。
3. 枚举类的实例必须在枚举类中显示指出,因为枚举类在此之后不可能产生任何实例。列举这些实例时,系统默认追加public static final控制符。
4. 所有枚举类提供了一个values()方法,方便列举所有枚举值。
public class Temp {
public static void main(String[] args) {
new Temp().judge(SeasonEnum.SPRING); //通过EnumClass.variable的方式调用枚举值
for(SeasonEnum es : SeasonEnum.values()) { //通过EnumClass.values()方法返回所有枚举值
System.out.println(es);
}
}
public void judge (SeasonEnum se) {
switch (se) { //JDK1.5后,java添加了switch支持Enum的功能
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case FALL:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
}
}
}
enum SeasonEnum { //定义一个枚举类,包含四个值
SPRING,SUMMER,FALL,WINTER;
}
5. 枚举类的属性,方法和构造器。
如下段代码,如果枚举类Gender拥有一个成员属性name,则为其赋值的方法可以写成:
public class Temp {
public static void main(String[] args) {
Gender g = Gender.valueOf(Gender.class, "MALE"); //通过valueOf()方法创建枚举对象
g.setName("女"); //输出:参数错误。
}
}
enum Gender {
MALE,FEMALE;
private String name;
public void setName (String name) {
switch (this) {
case MALE:
if ("男".equals(name))
this.name = name;
else {
System.out.println("参数错误");
return;
}
break;
case FEMALE:
if ("女".equals(name))
this.name = name;
else {
System.out.println("参数错误");
return;
}
break;
}
}
}
为了避免上端代码出现的参数错误,我们应当将name设置成private final的,并使用构造器赋值:
public class Temp {
public static void main(String[] args) {
Gender g = Gender.valueOf(Gender.class, "FEMALE"); //通过valueOf()方法创建枚举对象
System.out.println(g.getName()); //输出:女
System.out.println(g.toString()); //输出:FEMALE
}
}
enum Gender {
MALE("男"),FEMALE("女"); //通过调用相应的构造器赋值
private final String name;
private Gender (String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}