枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中。而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围。
举个例子就明白了;
Public static class RainbowColor { //一周七天的定义 public static final int Mon = 1; public static final int tue = 2; public static final int wed = 3; public static final int Thu = 4; public static final int Fri = 5; public static final int Sat = 6; public static final int Sun = 7; }在程序中直接引用这些常量。但是,这种方式还是存在着一些问题。
1.类型不安全
由于星期常量的对应值是整数形,所以程序执行过程中很有可能给星期变量传入一个任意的整数值,导致出现错误。
2.没有命名空间
由于星期常量只是类的属性,当你使用的时候不得不通过类来访问。
3.一致性差
因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。
4.类型无指意性
由于一周枚举值仅仅是一些无任何含义的整数值,如果在运行期调试时候,你就会发现日志中有很多魔术数字,但除了程序员本身,其他人很难明白其奥秘。
在枚举类型中,一般定义形式如下:
enum 枚举名 {枚举值};其中,enum为java中得关键字。
在枚举值中应该罗列出所有的可用值,这些值称为枚举元素。例如:
enum Weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun};这里定义了一个枚举类型Weekday,枚举值有7个,即一周有7天。凡被说明为Weekday类型变量的取值,只能是这七天的某一天。
枚举变量也可用不同的方式说明,如先定义后说明,第一的同时说明或直接说明。
设有变量a,b,c被定义为上述的枚举类型Weekday, 可采用下列任一方式。
enum Weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun};//先定义 enum Weekday a, b, c;//后说明 或者为: enum Weekday{Mon,Tue,Wed,Thu,Fri,Sat,Sun} a,b,c;//定义的同时说明 或者为: enum {Mon,Tue,Wed,Thu,Fri,Sat,Sun} a,b,c;//直接说明当创建了一个枚举类型之后,就意味着可在今后的代码中进行调用。调用先前定义的媒体类型同其他的调用语句一样,需要声明该类的一个对象并通过对象对枚举类型进行操作。
enum Mycolor{红色,绿色,蓝色} public class EnumColor { public static void main(String[] args) { Mycolor c1 = Mycolor.红色; System.out.println(c1); Mycolor c2 = Mycolor.绿色; System.out.println(c2); Mycolor c3 = Mycolor.蓝色; System.out.println(c3); } }输出;
红色 绿色 蓝色在第01行中定义enum数据类型Mycolor. 其中设置的枚举值分别为红色,绿色,蓝色。第07,第10和第13行分别定义了枚举变量c1,c2,c3,其中c1,c2,c3三只能是Mycolor枚举元素中的三个值的一个,他们通过枚举名.枚举值的方法获得,第08,第11和第14行分别输出他们获得的枚举值,由上面的分析可知,通过Java提供的枚举类型,用户可以很轻松的调用枚举中的每一种颜色。
使用enum关键字创建的枚举类型,也可以直接在多种控制语句中使用,如switch语句中,在jdk1.5之前,switch语句只能用于判断字符和数字,他不能对在枚举中罗列的内容进行判断和选择,而在jdk1.5之后,通过enum创建的枚举类型也可以被switch判断使用。
package workspace; enum Mycolor {红色, 绿色, 蓝色} public class EnumColor { public static void main(String[] args) { Mycolor c1 = Mycolor.绿色; switch (c1) { case 红色: { System.out.println("我是红色!"); break; } case 绿色: { System.out.println("我是绿色!"); break; } case 蓝色: { System.out.println("我是蓝色!"); break; } } } }输出:
我是绿色!本题中通过switch调用枚举类型Mycolor完成对枚举类型的筛选,在第7行到第24行中,均是对switch语句的使用,由于Java采用的是Unicode的字符串编码方式,所以枚举值也支持中文,本题可以看出,在jdk1.5之后,switch同样可以用于判断一个枚举类型,并对枚举类型做出有效选择,这样在今后的程序写作过程中,就能够避免枚举类型多而繁琐的选择问题,这有助于增加代码的可读性和延伸性。