首页 > 代码库 > 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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。