Java ABCs (3): 枚举类和注解
文章目录
- 03 枚举类&注解
- 3-1 枚举类
- 枚举类的定义
- JDK5.0之前:自定义枚举类
- JDK5.0之后:enum关键字
- 3-2 注解(Annotation)
- 1. 注解的基本使用
- 2. 自定义注解
- 3. JDK提供的四种元注解
- @Retention
- @Target
- @Documented
- @Inherited
- 4. 通过反射获取具体注解信息
- 5. JDK8中注解的新特性
03 枚举类&注解
3-1 枚举类
枚举类的理解和适用情形:
- 类的对象只有有限个,并且是确定的
- 当需要定义一组常量时,强烈建议使用枚举类
- 如果枚举类中只有一个对象,则可以作为单例模式的实现方式
枚举类的定义
JDK5.0之前:自定义枚举类
基本步骤:
- 声明fields: 使用private final修饰
- 私有化类的构造器,并给对象属性赋值
- 提供当前枚举类的多个对象: public static final
//自定义枚举类
class Season {//1.声明fields: 使用private final修饰private final String seasonName;private final String seasonDesc;//2.私有化类的构造器,并给对象属性赋值private Season(String seasonName, String seasonDesc) {this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//3.提供当前枚举类的多个对象: public static finalpublic static final Season SPRING = new Season("春天", "春暖花开");public static final Season SUMMER = new Season("夏天", "夏日炎炎");public static final Season AUTUMN = new Season("秋天", "七月流火");public static final Season WINTER = new Season("冬天", "冰天雪地");//4.其他需求//get方法public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//toString方法@Overridepublic String toString() {return "Season:\t" + seasonName + "(" + seasonDesc + ")";}
}
JDK5.0之后:enum关键字
enum关键字定义的枚举类继承于java.lang.Enum类,其中已重写了Object的toString()方法。
基本步骤:
- 提供当前枚举类的多个对象: 多个对象之间用逗号隔开,末尾用分号结束
- 声明fields: 使用private final修饰
- 提供构造器,并给对象属性赋值
//使用enum关键字定义
enum Season1 {//1.提供当前枚举类的多个对象: 多个对象之间用逗号隔开,末尾用分号结束SPRING("春天", "春暖花开"),SUMMER("夏天", "夏日炎炎"),AUTUMN("秋天", "七月流火"),WINTER("冬天", "冰天雪地");//2.声明fields: 使用private final修饰private final String seasonName;private final String seasonDesc;//3.提供构造器,并给对象属性赋值Season1(String seasonName, String seasonDesc) {this.seasonName = seasonName;this.seasonDesc = seasonDesc;}//4.其他需求//get方法public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}}
Enum类的主要方法:
方法名 | 描述 |
---|---|
values() | 返回枚举类所有对象数组 |
valueOf | 传递枚举类型的Class对象和枚举常量名称给静态方法valueOf,可得到与参数匹配的枚举常量 |
toString | 得到当前枚举常量的名称 |
equals | 在枚举类型中可以直接使用"=="来比较两个枚举常量是否相等;equals()则是为了在Set\List\Map中使用 |
hashCode | Enum实现了hashCode()来和equals保持一致 |
getDeclaringClass | 得到枚举常量所属枚举类型的Class对象 |
ordinal | 得到当前枚举常量的次序 |
compareTo | 按照声明顺序排列枚举常量 |
使用enum关键字定义的枚举类实现接口的情况:
- 情况一:实现接口,在enum类中实现抽象方法
- 情况二:对每一个对象分别实现抽象方法
3-2 注解(Annotation)
从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是注解Annotation。
Annotation其实就是代码里的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。
通过使用Annotation,我们可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息
进行验证或者进行部署。
Annotation可以像修饰符一样被使用,可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,
这些信息被曝存在Annotation的"name=value"对中。
1. 注解的基本使用
示例一:生成文档的相关注解
示例二:在编译时进行格式检查(JDK内置的三个基本注解)
示例三:跟踪代码依赖性,实现替代配置文件功能
2. 自定义注解
- 注解声明为:@interface
- 定义内部成员,通常使用value表示(用无参数方法的形式定义);如果只有一个参数,建议使用参数名为value
- 可以指定成员的默认值,使用default + 默认值声明在value之后
- 如果定义的注解含有配置参数,那么使用时必须指定参数值,除非它有默认值。格式是“参数名=参数值”;
只有一个成员且参数名为value时,可以省略“value=” - 没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation
- 自定义的注解必须配上注解的信息处理流程才有意义(使用反射)。
- 自定义注解通常都会指明两个元注解:Retention, Target
示例:
public @interface MyAnnotation {String value() default "hello";
}
使用示例:
@MyAnnotation
class Person {private String name;private String gender;public Person() {}public Person(String name, String gender) {this.name = name;this.gender = gender;};
}@MyAnnotation(value = "ThisIsASubClass")
class Student extends Person {private int grade;
}
3. JDK提供的四种元注解
JDK的元注解用于修饰其他Annotation定义。
JDK5.0提供了4个标准的meta-annotation类型,分别是:
- Retention
- Target
- Documented
- Inherited
@Retention
只能用于修饰一个Annotation定义,用于指定该Annotation的生命周期。
@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention时必须为该value成员变量指定值:
- RetentionPolicy.SOURCE: 在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释。
- RetentionPolicy.CLASS: 在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注释。默认值。
- RetentionPolicy.RUNTIME: 在运行时有效(即运行时保留),当运行Java程序时,JVM会保留注释。程序可以通过反射获取该注释。
@Target
用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。
ElementType | Description |
---|---|
CONSTRUCTOR | 用于描述构造器 |
FIELD | 用于描述域 |
LOCAL_VARIABLE | 用于描述局部变量 |
METHOD | 用于描述方法 |
PACKAGE | 用于描述包 |
PARAMETER | 用于描述参数 |
TYPE | 用于描述类、接口(包括注解类型)或enum声明 |
@Documented
被@Documented修饰的类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的。
定义为Documented的注解必须设置Retention值为RUNTIME。
@Inherited
被@Inherited修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。
实际应用中使用较少。
4. 通过反射获取具体注解信息
自定义注解:
import java.lang.annotation.*;@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotation {String value() default "hello";
}
使用自定义注解:
@MyAnnotation(value="hello")
class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}public void walk() {System.out.println("人走路");}public void eat() {System.out.println("人吃饭");}
}class Student extends Person implements Show {@Overridepublic void walk() {System.out.println("学生走路");}@Overridepublic void eat() {System.out.println("学生吃饭");}@Overridepublic void show() {System.out.println("这是一个学生");}
}
获取注解信息:
public class AnnotationTest {@Testpublic void testGetAnnotation() {Class studentClass = Student.class;Annotation[] annotations = studentClass.getAnnotations();for(Annotation annotation: annotations){System.out.println(annotation);}}
}
测试结果:
@day21.MyAnnotation(value=hello)Process finished with exit code 0
5. JDK8中注解的新特性
- 可重复注解:
- 在自定义注解MyAnnotation上声明@Repeatable,成员值为MyAnnotation.class
- MyAnnotation的Target和Retention和MyAnnotations相同
- 类型注解
- TYPE_PARAMETER: 使注解可以修饰泛型的类型
- TYPE_USE: 表示该注解能写在使用类型的任何语句中
Java ABCs (3): 枚举类和注解相关推荐
- java中的枚举类与注解学习笔记
java中的枚举和注解 01.枚举类的使用 1.1.枚举类的理解 1.2.自定义枚举类 1.3.使用enum关键字定义枚举类 1.4.Enum类中的常用方法 1.5.使用enum关键字定义的枚举类实现 ...
- 【Java高级】枚举类与注解
目录 01 枚举类 1.1 枚举类的理解 1.2 自定义枚举类 1.3 enum关键字定义枚举类 1.4 Enum中的常用方法 1.5 使用enum关键字定义的枚举类实现接口 02 注解 ...
- 学妹问我Java枚举类与注解,我直接用这个搞定她!
很多人问我学妹长什么样,不多说 上图吧! 学妹问我Java枚举类与注解,我直接一篇文章搞定! 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举 ...
- Java枚举类和注解
文章目录 枚举类和注解 枚举类的使用 枚举类的说明: 如何自定义枚举类?步骤: jdk 5.0 新增使用enum定义枚举类.步骤: 使用enum定义枚举类之后,枚举类常用方法:(继承于java.lan ...
- Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类
Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...
- day06--java高级编程:多线程,枚举类,注解,反射,网络通讯
1 Day16–多线程01 1.1 程序概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 1.2 进程 1.2.1 概念 进程(proce ...
- Java状态码枚举类
前言:当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请 ...
- Java_比较器枚举类和注解集合泛型
文章目录 Java_比较器 Java_自然排序:java.lang.Comparable Java_Comparable的实现 Java_定制排序java.util.Comparator Java_S ...
- 新星计划Day2【JavaSE】 枚举类与注解
新星计划Day2[JavaSE] 枚举类与注解
最新文章
- 走出“搜索引擎营销”三个误区
- 今天浏览新闻的时候,发现一张图片特别有感触
- 未发先侃?对比华为,高通第二代5G调制解调器如何?
- 个人认为不错的句子(part3)--衍生品是大型杀伤性武器
- [导入]C#好书盘点【月儿原创】
- python条件表达式三门课至少有一门及格_Python/ MySQL练习题(一)
- 深入Linux网络核心堆栈--netfilter详解(整理)
- 超详细的Redis实战笔记
- itextpdf生成pdf文件(含图片)
- 关于二手房的Python数据分析
- ECCV 2022 | 悉尼大学提出:绝对尺度感知,鲁棒,以及可泛化的自监督单目深度估计网络DynaDepth
- 联想y430p黑苹果之自定义屏幕亮度
- DLS 深度受限搜索 狼羊 过河 问题 python 实现
- dellemc服务器中文语言设置,美版windows10系统设置中文语言的方法
- 管理者如何抓共性问题进行组织优化运作
- 春秋云镜靶场Initial-WriteUP 专业徽章手把手教学
- CentOS7,Ubuntu系统中NCL的gedit编译器安装方法,亲测有效
- 女朋友问小灰:什么是数据仓库?什么是数据湖?什么是智能湖仓?
- 与iOS的初吻---方法命名与调用
- Open-Falcon学习之路(1)
热门文章
- Android 自定义控件-高仿猎豹清理大师自定义内存开口圆环控件
- 技术分享 | mongo 集群连接数暴涨处理案例一则
- 大专学历评审职称的条件和注意事项
- 当代大学生必看,划走了你就错过了太多了
- win7调整分辨率显示服务器,win7分辨率调整不了怎么解决|win7分辨率调整不了的解决方法...
- Android 華爲/小米/OPPO/VIVO桌面角標
- 【CMake】cmake的install指令
- 龙之谷服务器构架结构设计实现分析
- 西天取经项目小组访谈(个人原创)
- C++定义一个不定长的数组的方法