Enum (枚举)类型的介绍e
枚举类型(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提供的枚举类型,用户可以很轻松的调用枚举中的每一种颜色。
在switch语句中使用枚举
使用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同样可以用于判断一个枚举类型,并对枚举类型做出有效选择,这样在今后的程序写作过程中,就能够避免枚举类型多而繁琐的选择问题,这有助于增加代码的可读性和延伸性。