JDK5.0新特性的学习--枚举

阅读更多

(1)简单的例子

  JDK5.0的枚举,正好可以解决上面我们讨论的问题,而且更简洁。还是用上面的代码做示例,只需要将Color类修改如下,Flower、Client都无法更改。

 
  
  
  
  
java 代码
  1. public enum Color {    RED, BLACK, YELLOW, BLUE, WHITE, ORANGE}  
接下来我们做更深一步的说明: 
  • 所有枚举类都是java.lang.Enum的子类(JDK内核自动将Color隐性继承自Enum)
  • RED...ORANGE都是Color的实例对象
 上面的Color枚举类,功能好象还和以前的例子不完全一样,我们再次修改如下。
  
  
  
  
java 代码
  1. public enum Color {       
  2.       RED(0), BLACK(1), YELLOW(2), BLUE(3), WHITE(4), ORANGE(5);          
  3.       int color;       
  4.       Color(int color){           
  5.           this.color=color;       
  6.       }           
  7.       public int getColorValue(){           
  8.            return color;       
  9.       }   
  10. }  
从这里我们可以看到枚举类是如何创建构造函数及方法的,有一些隐性的东西要说明一下: 
  • 枚举类的构造函数要求是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);

你可能感兴趣的:(C,C++,C#,JDK)