Java中枚举的使用
时间:2014-04-29 17:11:45
收藏:0
阅读:449
一. 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 : 现在是冬天
评论(0)