(1)简单的例子
JDK5.0的枚举,正好可以解决上面我们讨论的问题,而且更简洁。还是用上面的代码做示例,只需要将Color类修改如下,Flower、Client都无法更改。
java 代码
- public enum Color { RED, BLACK, YELLOW, BLUE, WHITE, ORANGE}
接下来我们做更深一步的说明:
- 所有枚举类都是java.lang.Enum的子类(JDK内核自动将Color隐性继承自Enum)
- RED...ORANGE都是Color的实例对象
上面的Color枚举类,功能好象还和以前的例子不完全一样,我们再次修改如下。
java 代码
- public enum Color {
- RED(0), BLACK(1), YELLOW(2), BLUE(3), WHITE(4), ORANGE(5);
- int color;
- Color(int color){
- this.color=color;
- }
- public int getColorValue(){
- return color;
- }
- }
从这里我们可以看到枚举类是如何创建构造函数及方法的,有一些隐性的东西要说明一下:
- 枚举类的构造函数要求是private的,如果象例子里那样不加修饰符,则Java会自动给加上。但如果你想加上public则会报错。
- RED(0), BLACK(1)...等枚举值必须定义在前面,而且最后一个枚举值ORANGE(5);未尾用分号结束。
(2)在循环中使用枚举类
枚举类都有一个values方法可以得到它值的数组:Color[] colors=Color.values();而且枚举类都支持泛型
(以后的文章会重点说到),所以我们可以这样来遍历这个数组:
Color[] colors = Color.values();
for (Color c : colors) {
System.out.println("color value=" + c.getColorValue());
}(3)在switch(分支)中使用枚举
如下代码示例,这里要注意将“case RED:”写成“case Color.RED:”是会报错的,因为JDK5.0可以自动根据
“switch (color)”就判断入你要使用什么枚举类型了。从这里也可以看出JDK5.0确实为用户做了帖心的考虑,尽量让程序员少写代码,写更简单的代码。
Color color = Color.RED;
switch (color) {
case RED:
//process ...
break;
case BLACK:
//process ...
break;
case WHITE:
//process ...
break;
default:
//process ...
}(4)JDK5.0新增的集合:EnumMap 和EnumSet
给出两个例子,一切尽在不言中了。(说明:这两个例子用到了JDK5.0中泛型的知识)
Map map = new EnumMap(Color.class);
map.put(Color.RED, "红色");
map.put(Color.BLACK, "黑色");
map.put(Color.WHITE, "白色");
for (Color c : Color.values()) {
System.out.println(c + " chinese is: " + map.get(c));
}Set all = EnumSet.allOf(Color.class);
EnumSet warmColors = EnumSet.of(Color.RED, Color.YELLOW);
Set notWarmColors = EnumSet.complementOf(warmColors);
Set notBlack = EnumSet.range(Color.RED, Color.YELLOW);