`
newjueqi
  • 浏览: 12050 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JDK5.0新特性(3)——枚举

    博客分类:
  • java
阅读更多

【文章标题】JDK5.0新特性(3)——枚举

【文章作者】曾健生

【作者邮箱】zengjiansheng1@126.com

【作者QQ190678908

【作者博客】http://blog.csdn.net/newjueqi

                     http://newjueqi.iteye.com/

【作者声明】欢迎转载文章,但转载请保留文章的完整性以及注明文章的出处。

 

*******************************************************************************

       SunJDK5.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.    在方法中用thisswitch语句执行对应枚举值的方法

2.    在枚举值中使用匿名内部类分别实现方法。

 

下面代码例子定义一个接口SeaInfo,接口中有一个方法getDate()用来获取季节的月份,让每个枚举值分别实现这个方法:

 

接口的定义如下:

/*

 * getDate()用来获取季节的月份

 */

public

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics