Java 1.5新特性Enum的学习和使用
很多时候我们定义了一组值来表示用于特定的数值,往往都是习惯性地使用常量:
运行结果:
RED is : 红色
GREEN is : 绿色
BLUE is : 蓝色
YELLOW is : 黄色
BLACK is : 黑色
WHITE is : 白色
以上的例子提醒我们,不需要在外面的代码添加switch逻辑来判断以赋予不同的值,直接在enum里面处理就完成了。
注意:在case标签中,枚举前缀不能出现,即case Color.RED是不合法的,只能直接用枚举值RED。而在其他地方出现时则必须用Color.RED。
为什么switch可以支持enum呢?switch其实是支持int基本类型,而因为byte,short,char可以向上转换为int,所以switch也支持它们,但long因为转换int会截断便不能支持。
而enum在switch中也是int类型,看了《switch之enum》,应该这样解释:
我使用jd反编译上面那段switch代码:
??? = EnumColor.Color.RED;
switch (EnumColor.1.$SwitchMap$EnumColor$Color[???.ordinal()]) {
case 1:
System.out.println("红色");
break;
case 2:
System.out.println("绿色");
break;
case 3:
System.out.println("黑色");
break;
}
可以看到case后面的值变成int值,但这个数值并不是枚举值的ordinal。jd没有把EnumColor$1里面的代码反编译出来,但看了文章里面那段static int[] $SWITCH_TABLE$meiju$EnumTest(),原来这里面有一个int数组,按照枚举值的ordinal值作为索引值,依次给数组元素赋值从1开始:
ai[Color.RED.ordinal()] = 1;
ai[Color.GREEN.ordinal()] = 2;
...
再看看switch括号里面的就是数组[???.ordinal()],明了!
下面说一下方法枚举(多态),我一开始写的是以下代码:
结果编译不通过:
EnumGrade.java:10: 无法从静态上下文中引用非静态 变量 base
return base;
^
EnumGrade.java:16: 无法从静态上下文中引用非静态 变量 base
return base*2;
^
EnumGrade.java:22: 无法从静态上下文中引用非静态 变量 base
return base*3;
^
于是修改为以下代码:
运行结果:
运行结果:
ON
OFF
ON:is On
OFF:is off