文章目录

  • 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之前:自定义枚举类

基本步骤:

  1. 声明fields: 使用private final修饰
  2. 私有化类的构造器,并给对象属性赋值
  3. 提供当前枚举类的多个对象: 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()方法。

基本步骤:

  1. 提供当前枚举类的多个对象: 多个对象之间用逗号隔开,末尾用分号结束
  2. 声明fields: 使用private final修饰
  3. 提供构造器,并给对象属性赋值
//使用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. 自定义注解

  1. 注解声明为:@interface
  2. 定义内部成员,通常使用value表示(用无参数方法的形式定义);如果只有一个参数,建议使用参数名为value
  3. 可以指定成员的默认值,使用default + 默认值声明在value之后
  4. 如果定义的注解含有配置参数,那么使用时必须指定参数值,除非它有默认值。格式是“参数名=参数值”;
    只有一个成员且参数名为value时,可以省略“value=”
  5. 没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation
  6. 自定义的注解必须配上注解的信息处理流程才有意义(使用反射)。
  7. 自定义注解通常都会指明两个元注解: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): 枚举类和注解相关推荐

  1. java中的枚举类与注解学习笔记

    java中的枚举和注解 01.枚举类的使用 1.1.枚举类的理解 1.2.自定义枚举类 1.3.使用enum关键字定义枚举类 1.4.Enum类中的常用方法 1.5.使用enum关键字定义的枚举类实现 ...

  2. 【Java高级】枚举类与注解

    目录​​​​​​​ 01 枚举类 1.1 枚举类的理解 1.2 自定义枚举类 1.3 enum关键字定义枚举类 1.4 Enum中的常用方法 1.5 使用enum关键字定义的枚举类实现接口 02 注解 ...

  3. 学妹问我Java枚举类与注解,我直接用这个搞定她!

    很多人问我学妹长什么样,不多说 上图吧! 学妹问我Java枚举类与注解,我直接一篇文章搞定! 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举 ...

  4. Java枚举类和注解

    文章目录 枚举类和注解 枚举类的使用 枚举类的说明: 如何自定义枚举类?步骤: jdk 5.0 新增使用enum定义枚举类.步骤: 使用enum定义枚举类之后,枚举类常用方法:(继承于java.lan ...

  5. Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类

    Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...

  6. day06--java高级编程:多线程,枚举类,注解,反射,网络通讯

    1 Day16–多线程01 1.1 程序概念 程序(program):是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 1.2 进程 1.2.1 概念 进程(proce ...

  7. Java状态码枚举类

    前言:当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请 ...

  8. Java_比较器枚举类和注解集合泛型

    文章目录 Java_比较器 Java_自然排序:java.lang.Comparable Java_Comparable的实现 Java_定制排序java.util.Comparator Java_S ...

  9. 新星计划Day2【JavaSE】 枚举类与注解

    新星计划Day2[JavaSE] 枚举类与注解

最新文章

  1. 走出“搜索引擎营销”三个误区
  2. 今天浏览新闻的时候,发现一张图片特别有感触
  3. 未发先侃?对比华为,高通第二代5G调制解调器如何?
  4. 个人认为不错的句子(part3)--衍生品是大型杀伤性武器
  5. [导入]C#好书盘点【月儿原创】
  6. python条件表达式三门课至少有一门及格_Python/ MySQL练习题(一)
  7. 深入Linux网络核心堆栈--netfilter详解(整理)
  8. 超详细的Redis实战笔记
  9. itextpdf生成pdf文件(含图片)
  10. 关于二手房的Python数据分析
  11. ECCV 2022 | 悉尼大学提出:绝对尺度感知,鲁棒,以及可泛化的自监督单目深度估计网络DynaDepth
  12. 联想y430p黑苹果之自定义屏幕亮度
  13. DLS 深度受限搜索 狼羊 过河 问题 python 实现
  14. dellemc服务器中文语言设置,美版windows10系统设置中文语言的方法
  15. 管理者如何抓共性问题进行组织优化运作
  16. 春秋云镜靶场Initial-WriteUP 专业徽章手把手教学
  17. CentOS7,Ubuntu系统中NCL的gedit编译器安装方法,亲测有效
  18. 女朋友问小灰:什么是数据仓库?什么是数据湖?什么是智能湖仓?
  19. 与iOS的初吻---方法命名与调用
  20. Open-Falcon学习之路(1)

热门文章

  1. Android 自定义控件-高仿猎豹清理大师自定义内存开口圆环控件
  2. 技术分享 | mongo 集群连接数暴涨处理案例一则
  3. 大专学历评审职称的条件和注意事项
  4. 当代大学生必看,划走了你就错过了太多了
  5. win7调整分辨率显示服务器,win7分辨率调整不了怎么解决|win7分辨率调整不了的解决方法...
  6. Android 華爲/小米/OPPO/VIVO桌面角標
  7. 【CMake】cmake的install指令
  8. 龙之谷服务器构架结构设计实现分析
  9. 西天取经项目小组访谈(个人原创)
  10. C++定义一个不定长的数组的方法