1.枚举类学习
1.1 定义枚举类
- 枚举类可以实现一个或多个接口,使用enum定义的枚举类默认继承了java.lang.Enum类,而不是默认继承Object类,因此枚举类不能显示继承其他父类。其中java.lang.Enum类实现了java.lang.Serializable和java.lang.Comparable两个接口。
- 使用enum定义、非抽象的枚举类默认会使用final修饰,因此枚举类不能派生子类。
- 枚举类的构造器只能使用private访问控制符,如果省略了构造器的访问控制符,则默认使用private修饰;如果强制指定访问控制符,则只能指定private修饰符。
- 枚举类的所有实例必须在枚举类的第一行显式列出,否则这个枚举类永远都不能产生实例。列出这些实例时,系统会自动添加public static final 修饰,无须程序员显式添加。
- 枚举类默认提供了一个values()方法,该方法可以很方便地遍历所有的枚举值。
如下定义周一到周日的常量
|
相当简洁,在定义枚举类型时我们使用的关键字是enum,与class关键字类似,只不过前者是定义枚举类型,后者是定义类类型。
1.2 枚举类的实现原理
我们大概了解了枚举类型的定义与简单使用后,现在有必要来了解一下枚举类型的基本实现原理。实际上在使用关键字enum
创建枚举类型并编译后,编译器会为我们生成一个相关的类,这个类继承了Java API
中的java.lang.Enum
类,也就是说通过关键字enum
创建枚举类型在编译后事实上也是一个类类型而且该类继承自java.lang.Enum
类。
查看反编译Day.class文件:
|
- ①从反编译的代码可以看出编译器确实帮助我们生成了一个Day类(注意该类是final类型的,将无法被继承)而且该类继承自
java.lang.Enum
类,该类是一个抽象类(稍后我们会分析该类中的主要方法)。 - ②除此之外,编译器还帮助我们生成了7个Day类型的实例对象分别对应枚举中定义的7个日期,这也充分说明了我们前面使用关键字enum定义的Day类型中的每种日期枚举常量也是实实在在的Day实例对象,只不过代表的内容不一样而已。注意编译器还为我们生成了两个静态方法,分别是
values()和 valueOf()
。 - ③到此我们也就明白了,使用关键字enum定义的枚举类型,在编译期后,也将转换成为一个实实在在的类,而在该类中,会存在每个在枚举类型中定义好变量的对应实例对象,如上述的
MONDAY
枚举类型对应public static final Day MONDAY;
,同时编译器会为该类创建两个方法,分别是values()和valueOf()
。到此相信我们对枚举的实现原理也比较清晰。下面我们深入了解一下java.lang.Enum类以及values()和valueOf()的用途。
1.3 枚举的常见方法
2.枚举类使用
2.1常量
系统里实现常量的三种方式接口常量、类常量、枚举常量
2.1.1接口常量
写法(1)利弊:用到 DefaultValues.DEFAULT_AP 的含义,必须看类里的注释,知道他表示中心。如果常量很多的话,把所有的常量都放在这一个接口里边,这种方式感觉也不是很友好。
|
写法(2)利弊:公司的接口常量是在接口里定义静态内部类,他可以把不同的功能的常量类进一步分类。把不同功能的常量放在了接口的内部类里,通过不同的内部类可以清楚的知道一个常量的含义。
|
2.1.2类常量
虽然有了枚举,可能是由于设计者习惯问题,还有很多人用的类常量, 定义了类常量,用一个Map<Integer, String>
来封装常量对应的信息,在static
代码块里,类初始化的时候执行一次put。用的时候 ResponseCode.RESP_INFO.get("DATABASE_EXCEPTION");
就能取出响应信息 由于项目是前后端分离,在接口文档里需要写上状态码,还得写上状态码对应的提示信息,而且我们的响应类 RespInfo 有message属性,就是保存常量类里状态码对应的信息的。
|
2.1.3枚举常量
所有的枚举类都是Enum类的子类,就行Object类一样,只是没有写出来,所以可以枚举类可调用Enum的方法。注意是逗号分隔属性,只有属性后边没有方法的话,最后加不加分号都行。
写法(1)
|
写法(2)
|
2.2 switch结合枚举类
JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。
枚举是声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。枚举是将变量的值一一列出来,变量的值只局限于列举出来的值的范围内。
△注意:
枚举只是枚举类型,不能够赋值操作。如下:GREEN默认值为0
,但是GREEN不能=0
,因为数据类型不一样。枚举中变量未直接赋值,默认等于前一个变量值加一,起始值默认为0。
|
2.3 向枚举中添加新的方法
如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号(“;”),java中要求必须先定义java实例。
|
2.4 实现接口
- 所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。
- 如果由枚举类来实现接口里的方法,则每个枚举值在调用该方法时都有相同的行为方式(因为方法体完全一样)。如果需要每个枚举值在调用该方法时呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法,每个枚举值提供不同的实现方式,从而让不同的枚举值调用该方法时具有不同的行为方式。
|
2.5 使用接口组织枚举
|