但行好事  莫问前程

枚举系列(二):枚举类入门

Java5新增了一个enum关键字(它与class,interface关键字的地位相同),用以定义枚举类。枚举类是一种特殊的类,它一样有自己的Field,方法,可以实现一个或者多个接口,也可以定义自己的构造器。一个Java源文件最多只能定义一个public访问权限的枚举类,且该Java源文件也必须和该枚举类的类名相同。但是枚举类终究不是普通类,它与普通类有如下简单区别:

(1). 枚举类可以实现一个或者多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是继承Object类。其中java.lang.Enum类实现了java.lang.Serializablejava.lang.Comparable接口。

(2). 使用enum定义,非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。

(3). 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。

(4). 枚举类的所有实例必须在枚举类的第一行显示列出,否则这个枚举类永远不能产生实例。列出这些实例时,系统会自动添加public static final修饰,无须程序员显示添加。

所有的枚举类都提供了一个values方法,该方法可以很方便的遍历所有的枚举值。下面定义了一个SeasonEnum枚举类。

public enum SeasonEnum
{
    // 在第一行列出4个枚举实例
    SPRING,SUMMER,FALL,WINTER;
}

编译上面的java程序,将生成一个SeasonEnum.class文件,这表明枚举类是一个特殊的java类。由此可见,enum关键字和class,inteface关键字的作用大致相似。

定义枚举类时,需要显示列出所有的枚举值,正如上面的SPRING,SUMMER,FALL,WINTER所示,所有的枚举值之间以英文逗号(,)隔开,枚举值列举结束后以英文分号作为结束。这些枚举值代表了该枚举类的所有可能实例。

如果需要使用该枚举类的某个实例,则可使用EnumClass.variable的形式,如SeasonEnum.SPRING

public class EnumTest
{
    public void judge(SeasonEnum s)
    {
        //switch语句里的表达式可以是枚举值
        switch (s)
        {
            case SPRING:
                System.out.println("春暖花开,正好踏青");
                break;
            case SUMMER:
                System.out.println("夏日炎炎,适合游泳");
                break;
            case FALL:
                System.out.println("秋高气爽,进补及时");
                break;
            case WINTER:
                System.out.println("冬日雪飘,围炉赏雪");
                break;
        }
    }
    public static void main(String[] args)
    {
        //所有枚举类都有一个values方法,返回该枚举类的所有实例
        for (SeasonEnum s : SeasonEnum.values())
        {
            System.out.println(s);
        }
        //平常使用枚举实例时,
        //总是通过EnumClass.variable形式来访问
        new EnumTest().judge(SeasonEnum.SPRING);
    }
}

上面程序测试了SeasonEnum枚举类的用法,该类通过values方法返回了SeasonEnumm枚举类的所有实例,并通过循环迭代输出了SeasonEnumm枚举类的所有实例。

不仅仅如此,上面程序的switch表达式还使用了SeasonEnumm对象作为表达式,这是JDK1.5增加枚举后对switch的扩展:switch控制表达式可以是任何枚举类型。不仅如此,当switch控制表达式使用枚举类型时,后面case表达式中的值直接使用枚举值的名字,无须添加枚举类作为限定。

由于所有的枚举类都继承了java.lang.Enum类,所以枚举类可以直接使用java.lang.Enum类中所包含的方法。java.lang.Enum类中提供了如下几个方法。

(1).int compareTo(E o):该方法用于与指定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例进行比较。如果该对象位于指定枚举对象之后,则返回正整数;如果该枚举对象位于指定枚举对象之前,则返回负整数,否则返回零。

(2).String name():返回此枚举实例的名称,这个名称就是定义枚举类时列出的所有枚举值之一。与此方法相比,大多数程序员应该优先考虑使用toString()方法,因为toString()方法返回更加用户友好的名称。

(3).int ordinal():返回枚举值在枚举类中的索引值(就是枚举值在枚举类声明中的位置,第一个枚举值的索引值为零)。

(4).String toString():返回枚举常量的名称,与name()方法相似,但是toString()方法更加常用。

(5).public static > T valueOf(Class enumType, String name):这是一个静态方法,用于返回指定枚举类中指定名称的枚举值。名称必须与在该枚举类中声明枚举值时所用的标识符完全匹配,不允许使用额外的空白字符。

正如前面看到的,当使用System.out.println(s)语句来打印枚举值时,实际输出的是该枚举值的toString()方法,也就是输出该枚举值的名字。

附:源代码示例

github地址:点击查看
码云地址:点击查看

打赏
欢迎关注人生设计师的微信公众账号
公众号ID:longjiazuoA

未经允许不得转载:人生设计师 » 枚举系列(二):枚举类入门

分享到:更多 ()

人生设计师-接受不同的声音

联系我关于我