【文章标题】JDK5.0新特性(3)——枚举
【文章作者】曾健生
【作者邮箱】zengjiansheng1@126.com
【作者QQ】190678908
【作者博客】http://blog.csdn.net/newjueqi
http://newjueqi.iteye.com/
【作者声明】欢迎转载文章,但转载请保留文章的完整性以及注明文章的出处。
*******************************************************************************
Sun在JDK5.0中增加了对枚举的支持。在Java的实际开发中,有些类的实例数量是固定的,譬如表示星期几的类,就只能有7个固定的取值,因为一个星期就只有七天,又譬如表示季节的类,就只有春,夏,秋,冬这四个实例。把这种固定而且有限的类称为枚举类。
在JDK5.0前,需要使用枚举就必须手动实现,有点像是单态模式的实现方法,代码以季节类为例子:
//手动实现季节枚举类
class Season
{
//季节信息字符串
private String str;
private Season( String str )
{
this.str=str;
}
//分别创建4个季节类的实例
private final static Season SPRING=new Season( "春天" );
private final static Season SUMMER=new Season( "夏天" );
private final static Season AUTUMN=new Season( "秋天" );
private final static Season WINNTER=new Season( "冬天" );
//根据参数返回相对应的枚举量
public static Season getInstance( int num )
{
Season season=null;
switch( num )
{
case 1:
season=SPRING;
break;
case 2:
season=SUMMER;
break;
case 3:
season=AUTUMN;
break;
case 4:
season=WINNTER;
break;
}
return season;
}
//显示季节显示
public void showInfo()
{
System.out.println( str );
}
}
测试代码如下:
public class TestEnum {
public static void main(String[] args) {
Season spring=Season.getInstance(1);
spring.showInfo();
}
}
输出结果:春天
各位读者看到后是不是觉得很麻烦(呢,我也有同感^-^)
现在JDK支持了枚举类后,工作就轻松多了,这可是广大程序员的福音!!!
废话少说,现在开始进入正题。
把类定义为枚举类,只需要在类的声明时加上关键字“enum”即可。
枚举类和普通的类是有以下几点区别
1. 枚举类是默认继承java.lang.Enum 类。
2. 枚举类的构造函数默认使用 private 访问控制符,如
public enum Season {
public Season(){};
}
上面的蓝色字体部分就会报错
3. 枚举类所有的实例需要在类中的第一行列出(用“,”分割),所有的实例会默认添加public static final 属性。
4. 所有的枚举类会默认有个values()方法,返回所有枚举实例。
使用枚举类的属性需要注意:如果需要每个枚举实例所拥有的某个属性不一样,这个属性就应该修饰为private final。
但一个变量修饰为final,就只能有两种方法赋值:
1. 在初始化时赋值。这种方法行不通,因为要求每个枚举实例所拥有的某个属性不一样,如果在初始化时赋值,就意味着每个枚举实例所对应的属性都一样。
2. 在构造函数中赋值。从技术上可以实现。
下面一段实例代码,实现了每个季节的枚举实例在初始化后就拥有各自的季节信息:
package newjueqi.net.csdn.testenum;
/*
*实现了一个枚举类
*/
public enum Season {
//分别拥有各自的季节信息
SPRING( "春天来了" ),
SUMMER( "夏天来了" ),
AUTUMN( "秋天来了" ),
WINNER( "冬天来了" );
private final String str; //季节的信息
//在构造函数中赋初始值
Season( String str )
{
this.str=str;
}
//显示季节信息
public void showInfo()
{
System.out.println( str );
}
}
测试代码如下:
package newjueqi.net.csdn.testenum;
public class TestSeason {
public static void main(String[] args) {
//获取春天的实例
Season season=Season.SPRING;
//输出春天的信息
season.showInfo();
}
}
输出结果:春天来了
枚举和普通的Java类一样都能实现接口,但需要注意:如果要让每个枚举值
在调用接口方法实现不同的行为,则必须让每个枚举值分别实现这个方法。
具体有两种途径:
1. 在方法中用this和switch语句执行对应枚举值的方法
2. 在枚举值中使用匿名内部类分别实现方法。
下面代码例子定义一个接口SeaInfo,接口中有一个方法getDate()用来获取季节的月份,让每个枚举值分别实现这个方法:
接口的定义如下:
/*
* getDate()用来获取季节的月份
*/
public