枚举最简单的形式就是用来定义新的数据类型的命名常量列表.枚举类型的对象只能包含该列表定义的值.因此,枚举为精确定义包含固定数目有效值的新数据类型提供了一种方式.
枚举在日常生活中很常见.例如,美国硬币的枚举是1美分,5美分,10美分,25美分,50美分和1美元.月份的枚举包括1月到12月共12个月.一周各天的枚举是星期一,星期二,星期三,星期四,星期五,星期六,星期日.
从编程的角度看,枚举在需要定义一组代码条目集合的值时很有用.例如,可以使用枚举来代表一组状态成功,如果,成功,等待,失败和重试等等,他们表示各种动作的进度.过去,这些值被定义为final变量 ,但是枚举提供了一种更加结构化的方法.
枚举的基础知识
枚举使用enum关键字创建.例如,下面是一个简单的枚举示例,他列出了各种运输工具:
enum Transport { car,tuck,airplane,train,boat }
标识符CAR,TRUCK等称为枚举常量,他们都隐式声明为一个公有的静态Transport成员.而且,枚举常量的类型就是声明常量的枚举类型,在本例中是Transport.在Java中,这些常量称为自我类型化(self-typed),其中self指包含枚举常量的枚举.
定义了枚举之后,就可以创建枚举类型的变量.但是,尽管枚举定义了一个类类型,却不能使用new实例化枚举.应该像处理基本类型那样来声明和使用枚举变量,例如,下面的语句声明了一个transport枚举类型的变量tp:
transport tp;
由于tp是transport来信的,因此只能想他赋予枚举定义的值,例如,向tp赋值
tp = transport.car
注意,标识符car由tranceport限定.可以使用关系运算符==来比较两个枚举常量是否相等,例如,下面的语句比较tp的值是否与train常量相等:
if(tp == transport.train)
还可以使用枚举值来控制switch语句.当然,所有的case语句都必须使用来自switch表达式所用枚举中的enum常量,例如,下面的switch语句是完全有效的:
switch(tp) { case car: case truck; ... }
注意在case语句中,枚举常量的名称没有使用枚举类型名称来限定,也就是说,使用了TRUCK而不是Transport.TRUCK,这是因为switch表达式中的枚举类型已经隐式指定了case常量的枚举类型,也就没有必要使用枚举类型名称来限定case语句中的常量了.实际上,这样做反而会导致编译错误.
当枚举常量在诸如println()语句中显示时,将输出其名称,例如,下面的语句显示名称BOAT:
BOAT: System.out.println(Transport.BOAT);
下面的程序组合了个各段代码来演示Transport枚举:
public class test2 { // @param args public static void main(String args[]) { Transport tp; tp = Transport.AIRPLANE; System.out.println("value of tp : "+tp); tp = Transport.TRAIN; if(tp == Transport.TRAIN) System.out.println("tp contains TRAIN"); } } enum Transport { CAR,TRUCK,AIRPLANE,TRAIN,BOAT }
输出如下所示:
value of tp : AIRPLANE tp contains TRAIN
在继续讲解前,有一点需要注意,这里Transport中的常量使用大写,即使用CAR而不是car.但是,大写不是必须的,没有规则要求枚举常量都是大写.由于枚举经常替代final变量,而final变量通常是大写的,所以程序员自然也习惯对于枚举常量使用大写.当然,还有其他的一些观点和样式.