经常会需要一些只拥有一个预定义的固定序列值的变量。例如,假设要用名字weekday定义一个整型变量,用于存储一个代表一周中某一天的整形值。在理 想情况下,该变量需要限制在七个可能值中,即周一到周日中的某一个。在这种情况下,一个很自然的选择是使用一个称作【枚举(enumeration(】的 工具。对于上面的情况可以使用下列声明语句定义一个枚举:
enum Day { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }
该 语句为变量定义了一个新的类型Day,变量中只可以存储大括号中指定的某一个值。名字Monday、Tuesday……一直到Sunday都成为【枚举值 (enumeration constant)】,它们确定了Day型变量的取值范围。实际上,这些枚举值将于整数值相对应,但它们用不同于整型变量。
在类型名Day的开头使用的大写字母D,1/是因为习惯上自定义的类型都是以大写字母开头。通常枚举值的名字都被写成小写字母开头。
有了这个新的类型,就可以相下面这样【定义weekday变量】了:
Day weekday = Day.Tuesday;
该语句声明了变量Day型变量weekday,并用值Tuesday对其进行初始化。
【注意1:】这里使用的枚举值必须限定在它所在的枚举类型名范围内。如果不再该范围内,编译器讲不能够识别出这个值。对一个已知枚举类型变量的设置,只能使用该类型中定义
【注意3:】在Java 1.5以前,Switch语句只能和int, short, char以及byte这些数据类型联合使用。现在,在Java 1.5的枚举中,你也可以方便的使用switch 语句了。比如:
【一、概述】
枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。
枚举在什么地方适用呢?一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值, 而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。
【二、枚举类型的实现】
switch语句的条件只能接收数值或字符(byte、short、int或char)或枚举(enum)类型的变量名或表达式。
/**
* @author wanghengyuan
* Date:
* Time:
* 狙击手活动(枚举类型实现) *
*/
public enum SharpShooter {
locked, // 锁定
aim, // 瞄准
shoot // 射击
}
/**
* @author wanghengyuan
* Date:
* Time:
* 测试普通枚举类型
*/
public class TestDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestDemo test = new TestDemo();
test.doAction(SharpShooter.locked);
test.doAction(SharpShooter.aim);
test.doAction(SharpShooter.shoot);
}
/**
* 执行的动作
*/
public void doAction(SharpShooter action) {
switch(action) {
case locked:
System.out.println("1:锁定目标");
break;
case aim:
System.out.println("2:瞄准目标");
break;
case shoot:
System.out.println("3:射击");
break;
default:
System.out.println("*:游戏还没有定义此功能!");
}
}
}
【三、枚举类型的实质】
在编译SharpShooter_2.java后,会生成一个SharpShooter_2.class文件,这说明枚举类型的实质还是一个类。因此,在某种程度上,enum关键字的作用就是class或者interface。
当使用enum定义一个枚举类型时,实际上所定义的类型自动继承了java.lang.Enum类。而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final的。可以直接通过枚举类型名直接使用它们。
在 查询JDK1.5文档的java.lang.Enum类,里面清楚的说明:java.lang.Enum类是所有 Java 语言枚举类型的公共基本类。因此,所有枚举类型都拥有有java.lang.Enum类所提供的共有方法。因此,要学会使用枚举,还必须认识 java.lang.Enum类。下面将详细说明。
【四、java.lang.Enum类】
【五、枚举的高级用法】
1、枚举方法
既然枚举的本质是类,那么定义枚举类型时也可以定义方法。比如:
/**
* @author wanghengyuan
* 带方法的枚举类型
*/
public enum SharpShooter {
locked, aim, shoot;
public String getEnumCons() {
switch(this.ordinal()) {
case 0:
return "锁定目标";
case 1:
return "瞄准目标";
case 2:
return "射击";
default:
return "没有此索引值";
}
}
}
/**
* @author wanghengyuan
* 测试枚举方法
*/
public class TestDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (SharpShooter enumCons : SharpShooter.values()) {
System.out.println(enumCons.getEnumCons());
}
}
}
2、枚举构造方法
/**
* @author wanghengyuan
* 带私有构造方法的枚举类型
*/
public enum SharpShooter {
locked("锁定目标"), aim("瞄准目标"), shoot("射击");
/**
* 私有的构造方法
*/
private SharpShooter(String desc) {
this.desc = desc;
}
/**
* 获取枚举值的说明
* @return String
*/
public String getDesc() {
return desc;
}
// Private variables
private String desc;
}
/**
* 测试带私有构造方法的枚举类型
* @author wanghengyuan
*
*/
public class TestDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (SharpShooter enumCons : SharpShooter.values()) {
System.out.println(enumCons + ": " + enumCons.getDesc());
}
}
}