Java5 枚举类型

 Java5 枚举类型使用总结

一、概述

当使用enum定义一个枚举类型时,实际上所定义的类型自动继承了java.lang.Enum类。而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final的。可以直接通过枚举类型名直接使用它们。

枚举在什么地方适用呢?一条普遍规则是,任何使用常量的地方,例如目前用 switch 代码切换常量的地方。如果只有单独一个值(例如,鞋的最大尺寸,或者笼子中能装猴子的最大数目),则还是把这个任务留给常量吧。但是,如果定义了一组值,而这些值中的任何一个都可以用于特定的数据类型,那么将枚举用在这个地方最适合不过。

所有枚举类都继承了Enum的方法,下面我们详细介绍这些方法。
       (1)  ordinal()
方法: 返回枚举值在枚举类种的顺序。这个顺序根据枚举值声明的顺序而定。
       
(2)  compareTo()方法: Enum实现了java.lang.Comparable接口,因此可以比较象与指定对象的顺序。Enum中的compareTo返回的是两个枚举值的顺序之差。当然,前提是两个枚举值必须属于同一个枚举类,否则会抛出ClassCastException()异常。(具体可见源代码)
                 Color.RED.compareTo(Color.BLUE);  //
返回结果 -1
       (3)  values()
方法: 静态方法,返回一个包含全部枚举值的数组。
                 Color[] colors=Color.values();
                 for(Color c:colors){
                        System.out.print(c+",");
                 }//
返回结果:RED,BLUE,BLACK YELLOW,GREEN,
       (4)  toString()
方法: 返回枚举常量的名称。
                 Color c=Color.RED;
                 System.out.println(c);//
返回结果: RED
       (5)  valueOf()
方法: 这个方法和toString方法是相对应的,返回带指定名称的指定枚举类型的枚举常量。
                 Color.valueOf("BLUE");   //
返回结果: Color.BLUE
       (6)  equals()
方法: 比较两个枚举类对象的引用。

 
View Code
 1 public class EnumStudy {
2 public static void main(String [] args){
3 WeekDay weekDay=WeekDay.SUN;
4 System.out.println("对象本身:"+weekDay);//对象本身:SUN
5 System.out.println("枚举name方法"+weekDay.name());//枚举name方法SUN
6 System.out.println("枚举ordinal方法:序号"+weekDay.ordinal());//枚举ordinal方法:序号0
7 System.out.println("枚举toString方法"+weekDay.toString());//枚举toString方法SUN
8 //valuesOf()方法:将String转化成枚举对象
9 System.out.println(WeekDay.valueOf("FRI"));
10 //values()方法:返回所有的枚举值
11 System.out.println(WeekDay.values().length);
12 for(WeekDay wd:WeekDay.values()){
13 System.out.println(wd);
14 }
15 //*************枚举高级应用***************\\
16 System.out.println("-------------------------");
17 //枚举的每个值都是一个对象,他们都有构造方法,我们可给它重构一些构造方法
18 //每次第一个使用枚举值时,它会为所有枚举值都实例化一次
19 System.out.println(WeekDay2.SUN);
20 System.out.println(WeekDay2.TUE);
21 System.out.println("-------------------------");
22 //枚举的每个值都是一个对象,我我们也可以为它们添加一些属性和方法
23 TranfficLamp lamp = TranfficLamp.GREEN;
24 // TranfficLamp枚举添加的特有的属性
25 System.out.println(lamp.time);
26 // TranfficLamp枚举添加的特有的方法
27 System.out.println(lamp.nextLamp());
28 }
29 //普通枚举类
30 public enum WeekDay{
31 SUN,MON,TUE,WED,THI,FRI,SAT;
32 }
33 //有多个构造方法的枚举
34 public enum WeekDay2{
35 SUN(0),MON(1),TUE(),WED,THI,FRI,SAT;
36 //所有的方法或其它必须放在枚举值的下面
37 //构造器只能私有private,绝对不允许有public构造器。
38 //这样可以保证外部代码无法新构造枚举类的实例。
39 //这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。
40 //但枚举类的方法和数据域可以允许外部访问。
41 private WeekDay2(){
42 System.out.println("调用第一个构造方法");
43 }
44 private WeekDay2(int day){
45 System.out.println("调用第二个构造方法");
46 }
47 }
48 //有抽象方法和属性的枚举
49 public enum TranfficLamp{
50 RED(30){
51 public TranfficLamp nextLamp(){
52 return GREEN;
53 }
54 },
55 GREEN(45) {
56 public TranfficLamp nextLamp() {
57 return YELLOW;
58 }
59 },
60 YELLOW(5) {
61 public TranfficLamp nextLamp() {
62 return RED;
63 }
64 };
65 // 该枚举有一个抽象方法
66 public abstract TranfficLamp nextLamp();
67 // 该枚举有一个属性
68 public int time;
69 // 该枚举的构造方法必须要有一个int类型参数
70 private TranfficLamp(int time) {
71 this.time = time;
72 }
73 }
74 }

 
posted @ 2011-10-03 21:42  蛊惑Into  阅读(3956)  评论(1编辑  收藏  举报