黑马程序员技术交流社区

标题: 【黑马程序员济南】Java中的枚举 [打印本页]

作者: 大山哥哥    时间: 2017-12-31 20:35
标题: 【黑马程序员济南】Java中的枚举
本帖最后由 大山哥哥 于 2017-12-31 20:35 编辑

        在授课过程中发现偶尔在使用到枚举的时候,很多同学都不清楚枚举到底是什么,有什么作用,故在此写一写关于枚举的一些介绍,希望能帮助各位同学更深入的理解枚举的概念。
        枚举这个词看起来很高端、很抽象、很深奥的样子,但实际上说白了枚举就是一个有穷数据的集合。举个简单的例子,人的性别就是一个有穷数据,就固定的男性和女性;再例如民族、颜色、月份,这些都是可以穷举出来的数据,就这么固定的数量的种类,这些可以穷举的数据,都可以用枚举来表示。
        Java中的枚举关键字为enum,全称为enumeration,是 JDK1.5中引入的新特性,存放在java.lang包中。如果想定义一个简单的枚举来使用的话,直接像声明一个类一样声明枚举使用即可,只不过class关键字换成enum关键字,例如:

        这里声明了一个代表颜色的枚举Color,里面定义了三个枚举的值,红色、蓝色和绿色。当然,枚举里的值是可以任意定义的,你把它理解为常量就行了。那内部究竟是怎么实现的呢?
        创建枚举类型要使用 enum 关键字,当使用这个关键字声明枚举并列举出值的时候,隐含了所创建的类型都是 java.lang.Enum 类的子类(java.lang.Enum 是一个抽象类)。枚举类型符合通用模式 Class Enum<E extends Enum<E>>,而 E 表示枚举类型的名称。枚举类型的每一个值都将映射到 protected Enum(String name, int ordinal) 构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。也就是说,刚才的颜色的枚举的代码,实际上执行了三次默认的构造方法:
                                            new Enum<Color>("RED",0);
                                            new Enum<Color>("BLUE",1);
                                            new Enum<Color>("GREEN",2);
        所以我们可以尝试这么使用枚举:

        这样打印出来的结果是:BLUE,也就是上述构造方法里传入的字符串,这下明白枚举其实就是可穷举的常量这个说法了吧。
        那么枚举能用来干嘛呢,用常量不也能做到枚举可以做的事情吗?首先,在一些方法的参数类型固定的位置,用枚举作为类型比用常量更能合理的约束参数。例如有个方法让你传入性别——用public void test(int sex)的方式,可以用0代表女性,1代表男性,这样没问题,但是你也阻止不了其他人调用的时候传入3、4...这样的数值。而使用枚举就能完美的解决这个问题。而且枚举是支持if和switch语句的,举个例子,同样是刚才颜色的枚举:

        使用枚举,可以让数据的约束更完善,整个代码的可维护性更强,更符合面向对象封装的思想。那么接下来,我们看一下枚举中常用的API都有哪些:        int compareTo(E o)
                  比较此枚举与指定对象的顺序。

        Class<E> getDeclaringClass()
                  返回与此枚举常量的枚举类型相对应的 Class 对象。

        String name()
                  返回此枚举常量的名称,在其枚举声明中对其进行声明。

        int ordinal()
                  返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)。

        String toString()
                   返回枚举常量的名称,它包含在声明中。

        static <T extends Enum<T>> T valueOf(Class<T> enumType, String name)
                  返回带指定名称的指定枚举类型的枚举常量。
        可以把 enum 看成是一个普通的 class,它们都可以定义一些属性和方法,不同之处是:enum 不能使用 extends 关键字继承其他类,因为 enum 已经继承了 java.lang.Enum(java是单一继承)。而合理的使用枚举,可以在代码编写的过程中更加的方便、准确。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2