当一个类的实例对象是有限的而且是固定的,则称这些类为枚举类,实现枚举类有两种方法:
一:手动实现枚举类
当采用手动方法实现枚举类时,要将构造器方法隐藏,将这个类的所有可能出现的实例用public static final进行修饰,可以提供静态方法根据参数获取相应的实例。例如说季节类,季节本身是固定的,某些变量是固定,因此说可以手动实现Season类成为一个枚举类,定义如下:
<span style="font-size:14px;">public class Season {
private final String name ;
private final String 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 WINNER
= new Season("冬天","嗅梅");
private Season(String name, String desc) {
super();
this.name = name;
this.desc = desc;
}
public static Season getSeason( int seasonNum )
{
switch (seasonNum ) {
case 1:
return SPRING;
case 2:
return SUMMER;
case 3:
return FALL;
case 4:
return WINNER;
default:
return null;
}
}
public String getName() {
return this.name;
}
public String getDesc() {
return this.desc;
}
}</span>
<span style="font-size:14px;">public class SeasonText {
public static final int SEASON_SPRING = 1;
public static final int SEASON_SUMMER = 2;
public static final int SEASON_FALL = 3;
public static final int SEASON_WINNER = 4;
public SeasonText(Season s) {
System.out.println(s.getName() + s.getDesc());
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new SeasonText( Season.getSeason(SEASON_SPRING));
}
}</span>
手动实现具有局限性,当采用手动实现时,类型不安全,正如所写的Season类中,每一个季节于一个整数对应,这样的话每个季节完全可以当成一个整数使用,而且采用静态常量极易混淆,而且意义不明显SEASON_SPRING实际上只是一个int。
二:enum关键字定义枚举类
枚举类是特殊的类,枚举类用enum关键字代替了class关键字,枚举类可以有构造器,可以实现一个或多个接口,可以有自己的属性和方法,与正常类基本相同。但是枚举类默认继承java.lang.Enum类,并不是继承自Object。如果采用enum定义、非抽象的枚举类默认会采用final进行修饰,因此说枚举类不能派生子类。当然枚举类只允许用private修饰构造器,没写访问权限修饰符的话会自动补全,指定的话也只能选private。枚举类的所有实例必须在第一行显示的列出,否则这个枚举类永远无法产生实例,当然这些实例会自动添加public static final进行修饰。枚举类都提供了一个values方法,该方法可以遍历所有的枚举值。 Season类此时可以这样定义:
<span style="font-size:14px;">enum SeasonEnum {
SPRING,SUMMER,FALL,WINNER;
}
public class EnumText {
public 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 WINNER:
System.out.println("腊梅初开");
break;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for( SeasonEnum s : SeasonEnum.values() )
{
System.out.println(s);
System.out.println(s.name());
System.out.println(s.ordinal());
}
new EnumText().judge(SeasonEnum.SPRING);
}
}</span>
需要注意的是并不是所有的枚举类都使用了final进行修饰,只有非抽象的枚举类才默认使用final进行修饰,也就是抽象的枚举类不适用final。java.lang.Enum为枚举类中默认提供如下几个方法: compareTo用于枚举对象的顺序比较,同一个枚举实例只能与相同类内的实例进行比较。name()返回枚举实例名称,也就是定义枚举类时该实例的枚举值。ordinal()返回该实例在枚举类中的索引值,一般不要使用这个方法。静态方法valueOf用于返回指定名称的枚举值,名称匹配枚举类中定义枚举值时的标识符。
PS------枚举类实现接口
枚举类可以实现一个或多个接口,枚举类中的每个每个实例都必须对实现接口中的抽象方法分别进行实现,每个枚举实例提供的实现方法不同,使每个枚举类实例具有不同的行为方式。
枚举类中定义抽象方法不能用abstract关键字将枚举类定义为抽象类,但是说枚举类必须显示定义枚举实例,不能将枚举类作为父类继承因此只能在定义每个枚举实例时对抽象方法进行实现。