首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java 1.5新特性Enum的学习跟使用

2012-09-14 
Java 1.5新特性Enum的学习和使用很多时候我们定义了一组值来表示用于特定的数值,往往都是习惯性地使用常量

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

热点排行