3.2 Java之枚举与注解
枚举
- 补:相当于让每个对象重写抽象方法
- 枚举类的对象有限,通过关键字限制构造器
- 单例模式看作特殊的枚举类,只提供一个实例
自定义枚举类(1.5之前)
- 构造器私有,保证对象的有限性,保持封装性和不可更改性,属性私有和final
- 在内部创建对象(构造器私有),对象个数确定
- 对象是全局常量,通过构造器属性赋值后,final关键字使得属性不可更改
- 单例模式创建好对象后,通过公共方法调用,而枚举类直接通过类来调用对象,一旦通过声明调用对象,则拒绝修改
- Season类型常量,要大写
- 枚举类对象为全局常量,只能调用,拒绝修改
使用enum关键字定义枚举类
- 修改方式
- 将枚举类对象置于最前面,格式同最上方
- 省略修饰符(默认,同接口修饰符)
3.分号变逗号 - 其他同上
枚举类实例
Thread的内部类State是枚举类,只有六个对象,本质还是对象,但没有属性而已,例如上文的name
- 该类表示线程的生命周期
枚举类的方法
- values()方法返回枚举类的所有对象,以数组形式返回
- valueof()方法传入枚举类的对象名(字符串类型),返回对应的枚举类对象,
- 形参是类型的声明(SPRING而不是spring,Java区分大小写的)
- 若输入非枚举类对象名,否则报错,而不是null
实现接口的枚举类
正常用法
同接口章节,当做普通类
特殊用法
分别让对象实现接口的方法
- 红色波浪线是由于枚举类的对象未全部重写完接口方法
- 注意写法,枚举类对象的逗号前加{},然后重写方法
测试类
输出结果
注解
源文件的补充信息,不同于注释(单行,多行,文档注释)
基本的注解类型
各自的特定功能:
1. 表覆盖,显式表明重写父类方法
2. 表过时,当下可用,但要及时修改
3. 强迫症的福音,不让警告,添加语句(括号内可放置多个属性)
- rawtypes:未使用泛型
- unused:变量未使用
自定义注解
注解内部可添加成员变量
- 格式奇怪,看成String类型数组的一个属性(注解的成员变量属性用数组表示),只不过属性处添加了小括号
创建自定义注解
以下实例属性不使用数组,使用一个变量,添加属性默认值hello(非数组,只能书写一个属性)
自定义注解使用
元注解
修饰注解的注解
-
String name = “OK”
- 声明一个变量,OK是本身变量的实体内容
- 数据本身是个实体的内容,修饰变量的实体内容的称为元数据,如String(数据类型)和name(数据名)
Retention
-
@Retention: 只能用于修饰一个 Annotation, 用于指定该 Annotation 可以保留多长时间, @Rentention 包含一个 RetentionPolicy 类型的成员变量, 使用 @Rentention 时必须为该 value 成员变量指定值:
- RetentionPolicy.SOURCE: 编译器直接丢弃这种注释
- RetentionPolicy.CLASS: 编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 不会保留注解。 这是默认值
- RetentionPolicy.RUNTIME:编译器将把注释记录在 class 文件中. 当运行 Java 程序时, JVM 会保留注释. 程序可以通过反射获取该注释
总结:
Retention的成员变量可取的三个值是通过枚举类来表示,表示三种状态,
表明被注解的注解的生命周期编译时被抛弃,即不考虑了
- 编译时保存在class文件中,运行时不保留(默认状态)
- 编译,运行皆保留,可通过反射获取该注解,即该注解(非元注解)属于类的一部分,可获取
Target
- @Target: 用于修饰 Annotation 定义, 用于指定被修饰的 Annotation 能用于修饰哪些程序元素,即指明注解能修饰的结构
- @Target 也包含一个名为 value 的成员变量
type包括class,接口,枚举类
Documented
@Documented: 用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档.
定义为Documented的注解必须设置Retention值为RUNTIME。