在某些情况下,一个类的对象是有限而且是固定的,比如季节类,它只有4个对象;再比如星期类,它只有7个对象。这种实例有限而且固定的类,在java里被称为枚举类
如何手动实现枚举类
如果需要手动实现枚举类,可以采用如下设计方式。
通过private将构造器隐藏起来。把这个类的所有可能实例都使用public static final修饰的类变量来保存。
如果有必要,可以提供一些静态方法,允许其他程序根据特定参数来获取与之匹配的实例。
手动实现枚举类代码:
public class Season {
/**
* 手动实现枚举类
* @param args
*/
private String name;
private Season(String name) {
this.name = name;
}
public String getName(){
return name;
}
public static final Season SPIRNG=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 i){
if(i==1){
return SPIRNG;
}
if(i==2){
return SUMMER;
}
if(i==3){
return FALL;
}
if(i==4){
return WINTER;
}
return null;
}
}
测试类:
public class SeasonTest {
/**
* 手动实现枚举类
* @param args
*/
public static void main(String[] args) {
Season season=Season.getSeason(2);
System.out.println(season.getName());
}
}
定义枚举类语法
public enum SeasonEnum{
// 在第一行列出4个枚举实例
SPRING,SUMMER,FALL,WINTER;
// 等同于 public static final SeasonEnum SPRING = new
// SeasonEnum();
}
枚举类详解
所有的枚举值之间以英文逗号(,)隔开,枚举值列举结束后以英文分号作为结束。这些枚举值代表了该枚举类的所有可能的实例。
如果需要使用该枚举类的某个实例,则可使用EnumClass.variable的形式,如SeasonEnum.SPRING。
经过enum定义的枚举类文件,最多只能定义一个public访问权限的枚举类,且该java源文件也必须和该枚举类的类名相同。
枚举类与普通类的区别
枚举类可以实现一个或多个接口,使用enum定义的枚举类型默认继承了java.lang.Enum类,而不是继承Object类。
使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
枚举类的构造器只能用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。
枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加
public static final修饰,无须程序员显式添加。
所有的枚举类都提供了一个values方法,该方法可以很方便地遍历所有的枚举值。
枚举其他知识点
枚举类也是一种类,只是它是一种比较特殊的类,因此它一样可以定义Field、方法。
枚举类也可以实现一个或多个接口。与普通类实现一个或多个接口完全一样,枚举类实现一个或多个接口时,也需要实现该接口所包含的方法。
枚举类里定义抽象方法时不能使用abstract关键字将枚举类定义成抽象类(系统会自动会为它添加abstract关键字),但因为枚举类型需要显示创建枚举值,而不是作为父类,所以定义每个枚举值时必须为抽象方法提供实现,否则将出现编译错误。
枚举类在switch的用法
代码:
public class WeekSwitchTest {
public static void main(String[] args) {
Week week = Week.valueOf(Week.class, "THURSDAY");
switch (week) {
case MONDAY:
System.out.println("星期一");
break;
case TUESDAY:
System.out.println("星期二");
break;
case WEDNESDAY:
System.out.println("星期三");
break;
case THURSDAY:
System.out.println("星期四");
break;
case FRIDAY:
System.out.println("星期五");
break;
case SATURDAY:
System.out.println("星期六");
break;
case SUNDAY:
System.out.println("星期天");
break;
}
}
}