枚举可以取代以往常量的定义方式,将常量封装在类或接口中,这样就可以不用考虑类型的不匹配并且显式的替代了int型参数可能带来的模糊概念。枚举像一个类,又像一个数组。enum关键字看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。枚举类型有如下特征:
- 不能有public的构造函数,必须是private,这样做可以保证客户代码不能新建一个enum的实例,更安全。
- 所有枚举值都是public , static , final的。
- Enum默认实现了java.lang.Comparable接口。
- Enum覆载了了toString方法
- values()方法将枚举类型成员以数组的形式返回,valueOf()方法将普通字符串转化为枚举成员
- compareTo()方法用于比较枚举成员在定义时的顺序,ordinal()方法获取枚举成员在枚举类型中的索引
枚举类型的简单实现与运用:
public class EnumTest {
enum AnyEnum{ //定义枚举成员ABCD,使用构造方法初始化
Constants_A("我是枚举成员A"),
Constants_B(9),
Constants_C("我是枚举成员C",10),
Constants_D();
private String description;
private int i=5;
private AnyEnum() { //枚举类型的构造方法应该加上private,防止被客户代码实例化
}
private AnyEnum(String description) {
this.description = description;
}
private AnyEnum(int i) {
this.i = i;
}
AnyEnum(String description, int i) {
this.description = description;
this.i = i;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public void doIni(AnyEnum c){ //必须使用枚举类型成员否则会报错
switch (c){
case Constants_A:
System.out.println("我是Constants_A");
case Constants_B:
System.out.println("我是Constants_B");
case Constants_C:
System.out.println("我是Constants_C");
case Constants_D:
System.out.println("我是Constants_D");
}
}
}
public static void main(String[] args) {
for (int i = 0; i < AnyEnum.values().length; i++) { //values()将枚举类型成员以数组的形式返回
System.out.println();
System.out.println(AnyEnum.values()[i]+"调用getDescription()方法为:"+AnyEnum.values()[i].getDescription());
System.out.println(AnyEnum.values()[i]+"调用getI()方法为:"+AnyEnum.values()[i].getI());
}
//valueOf()将字符串转化为枚举成员,compareTo()用于比较枚举成员在定义时的顺序
int d = AnyEnum.values()[1].compareTo(AnyEnum.valueOf("Constants_D"));
System.out.println(d); //d=负值:AnyEnum.values()[1]定义在Constants_D后面;d=0,相同;d=正值,前面
System.out.println(AnyEnum.values()[2].ordinal()); //ordinal()获取枚举成员在枚举类型中的索引,这里是2
AnyEnum.values()[2].doIni(AnyEnum.valueOf("Constants_D"));
}
}