某些情况下,一个类的对象是有限并且固定的,比如季节类,只有四个对象。这种实例有限并且固定的类,为枚举类。
如何手动实现一个枚举类?
规则如下:
(1)通过private将构造器隐藏起来
(2)把这个类所有可能的实例都使用public static final 修饰的类变量来保存
举个例子:
public class Season {
private String name;
private String desc;
private Season(String name, String desc){
this.name = name;
this.desc = desc;
}
public String getName(){
return this.name;
}
public String getDesc(){
return this.desc;
}
public static final Season SPRING = new Season("春天","趁春踏青");
public static final Season SUMMER = new Season("夏天","夏日炎炎");
public static final Season FALL = new Season("秋天","秋高气爽");
public static final Season WINTER = new Season("冬天","冬雪三尺");
public static Season getSeason(int seasonNum){
switch(seasonNum){
case 1:
return SPRING;
case 2:
return SUMMER;
case 3:
return FALL;
case 4:
return WINTER;
default:
return null;
}
}
}
这个例子中,Season是一个不可变类。当其他程序要使用它的时候,可以使用getSeason()这个静态工厂方法来获取Season对象。
java中有封装好的枚举类,用关键字enum来定义,举一个小例子:
public enum SeasonEnum {
SPRING,SUMMER,FALL,WINTER;
}
定义枚举类需要注意一下几个问题:
(1)一个java源文件只能定义一个public访问权限的枚举类,并且该java源文件也必须和该枚举类的类名相同。
(2)枚举类默认使用final关键字修饰,所以不能派生子类。
(3)枚举类的构造方法只能用private修饰,不论显式还是隐式。
(4)枚举类的所有实例,必须在枚举类的第一行显式列出,否则这个枚举类不能产生实例。
public class SeasonEnumTestDemo_01 {
public static void main(String[] args){
for(SeasonEnum s : SeasonEnum.values()){
System.out.println(s);
}
judge(SeasonEnum.SPRING);
}
public static void judge(SeasonEnum s){
switch(s){
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case FALL:
System.out.println("秋天");
break;
case WINTER:
System.out.println("冬天");
break;
}
}
}
输出:
SPRING
SUMMER
FALL
WINTER
春天
枚举类有一些常用的方法,比如compareTo(),toString(),valueOf()等,详细用法查看java API。
在一个枚举类中,可以定义类的属性,也就是类的实例变量。比如:
public enum Gender {
MALE, FEMALE;
public String name;
}
public class GenderTestDemo_01 {
public static void main(String[] args){
Gender g = Enum.valueOf(Gender.class, "FEMALE");
g.name = "女";
System.out.println(g+"代表"+g.name);
}
}
以上,枚举类的实例只能是枚举值,不能随意的通过new来创建枚举类对象。
但是,一般的类,不会将成员变量的权限设置为public,类对外开放的是成员函数。所以,可以对以上的枚举类做一个改进。
public enum Gender1 {
MALE,FEMALE;
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
switch(this){
case MALE:
if(name.equals("男")){
this.name = name;
}else{
System.out.println("参数错误!");
return;
}
break;
case FEMALE:
if(name.equals("女")){
this.name = name;
}else{
System.out.println("参数错误!");
return;
}
break;
}
}
}