首页 > 代码库 > Java中枚举的使用

Java中枚举的使用

一. JDK5之前的实现方式

在枚举类型出现之前,java是通过在接口或者类中定义public static final 的变量来实现的。 比如对于四季的描述:
---------------------------------------------------------------------------------
public interface Season {
    public static final int SEASON_SPRINT = 1;
    public static final int SEASON_SUMMER = 2;
    public static final int SEASON_AUTUMN = 3;
    public static final int SEASON_WINTER = 4;
}
---------------------------------------------------------------------------------
@Test
public void test02() {
     printSeason(1);
     printSeason(2);
     printSeason(3);
     printSeason(4);
     printSeason(5);
}

public void printSeason(int season) {
    switch (season) {
        case Season.SEASON_SPRINT :
            System.out.println("现在是春天");
            break;
        case Season.SEASON_SUMMER :
            System.out.println("现在是夏天");
            break;
        case Season.SEASON_AUTUMN :
            System.out.println("现在是秋天");
            break;
        case Season.SEASON_WINTER :
            System.out.println("现在是冬天");
            break;
        default :
            System.out.println("现在是世界末日");
    }
}
---------------------------------------------------------------------------------
运行结果:
现在是春天
现在是夏天
现在是秋天
现在是冬天
现在是世界末日
 
当然,Season也可以是一个类,当使用类实现时,通常会私有化其构造方法。
[注意]. switch语句只有接受int型(包括可以静默转换为int型的数据类型,如char、byte、short)或枚举(enum)型。
 

二. JDK5中使用枚举的等价实现

---------------------------------------------------------------------------------
public enum Season {
    SPRINT,
    SUMMER,
    AUTUMN,
    WINTER
}
---------------------------------------------------------------------------------
@Test
public void test03() {
     printSeason(Season.SPRINT);
     printSeason(Season.SUMMER);
     printSeason(Season.AUTUMN);
     printSeason(Season.WINTER);
}

public void printSeason(Season season) {
     switch (season) {
         case SPRINT:
             System.out.println("现在是春天");
             break;
         case SUMMER:
             System.out.println("现在是夏天");
             break;
         case AUTUMN:
             System.out.println("现在是秋天");
             break;
         case WINTER:
             System.out.println("现在是冬天");
             break;
         default:
             System.out.println("现在是世界末日");
     }
}
---------------------------------------------------------------------------------
运行结果:
现在是春天
现在是夏天
现在是秋天
现在是冬天
 

三. 枚举类型实质

      在编Season.java后,会生成一个Season.class文件,这说明枚举类型的实质还是一个类。因此,在某种程度上,enum关键字的作用就是class或者interface。
      当使用enum定义一个枚举类型时,实际上所定义的类型自动继承了java.lang.Enum类。而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final的。可以直接通过枚举类型名直接使用它们。
 
四. 枚举高级应用
1. 枚举方法
 
既然枚举的本质是类,那么定义枚举类型时也可以定义方法。比如:
---------------------------------------------------------------------------------
public enum Season {
     SPRINT,
     SUMMER,
     AUTUMN,
     WINTER;
     public String printSeason() {
         switch (this.ordinal()) {
             case 0 :
                 return "现在是春天";
             case 1 :
                 return "现在是夏天";
             case 2 :
                 return "现在是秋天";
             case 3 :
                 return "现在是冬天";
             default :
                 return "现在是世界末日";
         }
     }
 }
---------------------------------------------------------------------------------
@Test
public void test04() {
    for (Season season : Season.values()) {
        System.out.println(season + " : " + season.printSeason());
    }
}
---------------------------------------------------------------------------------
运行结果:
SPRINT : 现在是春天
SUMMER : 现在是夏天
AUTUMN : 现在是秋天
WINTER : 现在是冬天
 
2. 枚举构造方法
 
---------------------------------------------------------------------------------
public enum Season {
     SPRINT("现在是春天"),
     SUMMER("现在是夏天"),
     AUTUMN("现在是秋天"),
     WINTER("现在是冬天");

     private String info;
     private Season(String info) {
         this.info = info;
     }

     public String printSeason() {
         return this.info;
     }
}
---------------------------------------------------------------------------------
@Test
public void test05() {
    for (Season season : Season.values()) {
        System.out.println(season + " : " + season.printSeason());
    }
}
---------------------------------------------------------------------------------
运行结果:
SPRINT : 现在是春天
SUMMER : 现在是夏天
AUTUMN : 现在是秋天
WINTER : 现在是冬天
 
3. 带有抽象方法的枚举
 
---------------------------------------------------------------------------------
public enum Season {
     SPRINT {
         @Override
         public String printSeason() {
             return "现在是春天";
         }
     },
     SUMMER {
         @Override
         public String printSeason() {
             return "现在是夏天";
         }
    },
    AUTUMN {
        @Override
        public String printSeason() {
            return "现在是秋天";
       }
    },
    WINTER {
        @Override
        public String printSeason() {
            return "现在是冬天";
        }
    };

    public abstract String printSeason();
}
---------------------------------------------------------------------------------
@Test
public void test06() {
    for (Season season : Season.values()) {
        System.out.println(season + " : " + season.printSeason());
    }
}
---------------------------------------------------------------------------------
运行结果:
SPRINT : 现在是春天
SUMMER : 现在是夏天
AUTUMN : 现在是秋天
WINTER : 现在是冬天 


来自为知笔记(Wiz)