枚举类

在某些情况下,一个类的对象是有限而且是固定的,比如季节类,它只有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;
}
}


}

原文地址:https://www.cnblogs.com/t0404/p/10291079.html