一、枚举类的使用

1. 枚举类的说明:

  1. 枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类

  2. 当需要定义一组常量时,强烈建议使用枚举类

  3. 枚举类的实现:

    • JDK 5.0以前需要自定义
    • JDK 5.0后新增enum关键字用于定义枚举类
  4. 如果枚举类中只一个对象,则可以作为单例模式的实现方式。

  5. 枚举类的属性:

    枚举类对象的属性不应允许被改动,所以应该使用 private final 修饰 枚举类的使用 private final修饰的属性应该在构造器中为其赋值 若枚举类显式的定义了带参数的构造器,则在列出枚举值时也必须对应的传入参数

2. 如何自定义枚举类?

步骤:

  1. 私有化构造器,保证不能在类的外部创建其对象;
  2. 在类的内部创建枚举类的实例。声明为:public static final
  1. 因为要通过类来调取使用,静态在类里面了,不动了,所以需要 public static
  2. 又不允许改变,所以为 final。

这个枚举类里面有好几个对象,每个对象相当于是一个常量

如果这个类只有一个对象,那么可以看成是一个单例模式

  1. 对象如果有实例变量,应该声明为private final,并在构造器中初始化;

代码示例:

//自定义枚举类
class Season{
//1.声明Season对象的属性: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 final的
public 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.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
} public String getSeasonDesc() {
return seasonDesc;
}
//4.其他诉求1:提供toString()
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}

3. JDK 5.0 新增使用enum定义枚举类。

使用说明:

  • 使用enum定义的枚举类默认继承了java.lang.Enum类,因此不能再继承其他类

  • 枚举类的构造器只能使用private权限修饰符

  • 枚举类的所有实例必须在枚举类中显式列出(“,”分隔“;”结尾)。列出的实例系统会自动添加public static final修饰

  • 必须在枚举类的第一行声明枚举类对象

代码示例:

//使用enum关键字枚举类
enum Season1 {
//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
SPRING("春天","春暖花开"),
SUMMER("夏天","夏日炎炎"),
AUTUMN("秋天","秋高气爽"),
WINTER("冬天","冰天雪地"); //2.声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc; //2.私化类的构造器,并给对象属性赋值 private Season1(String seasonName,String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
} //4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
} public String getSeasonDesc() {
return seasonDesc;
} }

Enum类的常用方法:

  1. values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。

  2. valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”.如不是,会有运行时异常IllegalArgumentException

  3. toString():返回当前枚举类对象常量的名称(可重写自定义)

  4. name():返回当前枚举类对象常量的名称(final不可重写)

  5. ordinal():返回枚举值在枚举元素数组中的下标。

代码示例:

Season1 summer = Season1.SUMMER;
//toString():返回枚举类对象的名称
System.out.println(summer.toString()); // System.out.println(Season1.class.getSuperclass());
System.out.println("****************");
//values():返回所的枚举类对象构成的数组
Season1[] values = Season1.values();
for(int i = 0;i < values.length;i++){
System.out.println(values[i]);
}
System.out.println("****************");
Thread.State[] values1 = Thread.State.values();
for (int i = 0; i < values1.length; i++) {
System.out.println(values1[i]);
} //valueOf(String objName):返回枚举类中对象名是objName的对象。
Season1 winter = Season1.valueOf("WINTER");
//如果没objName的枚举类对象,则抛异常:IllegalArgumentException
// Season1 winter = Season1.valueOf("WINTER1");
System.out.println(winter);

用Enum类定义的枚举类对象分别实现接口:

使用说明:

  1. 和普通Java类一样,枚举类可以实现一个或多个接口
  2. 若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。
  3. 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法

代码示例:

interface Info{
void show();
} //使用enum关键字枚举类
enum Season1 implements Info{
//1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
SPRING("春天","春暖花开"){
@Override
public void show() {
System.out.println("春天在哪里?");
}
},
SUMMER("夏天","夏日炎炎"){
@Override
public void show() {
System.out.println("宁夏");
}
},
AUTUMN("秋天","秋高气爽"){
@Override
public void show() {
System.out.println("秋天不回来");
}
},
WINTER("冬天","冰天雪地"){
@Override
public void show() {
System.out.println("大约在冬季");
}
};
}

二、注解的使用

1. 注解的理解

  1. jdk 5.0 新增的功能

  2. Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation,程序员可以在不改变原逻辑的情况下, 在源文件中嵌入一些补充信息。

  3. Annotation可以像修饰符一样使用,可以用来修饰包、类、构造器、方法、成员变量、参数、局部变量的声明,这些信息被保存在Annotation的“name = value”对中。

  4. 在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android 中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗 代码和XML配置等。

  5. 框架 = 注解 + 反射机制 + 设计模式

2. 注解的使用示例

使用 Annotation时要在其前面增加@符号,并把该 Annotation当成个修饰符使用。用于修饰它支持的程序元素

示例一:生成文档相关的注解

  • @author标明开发该类模块的作者,多个作者之间使用,分割
  • @version标明该类模块的版本
  • @see参考转向,也就是相关主题
  • @since从哪个版本开始增加的
  • @param对方法中某参数的说明,如果没有参数就不能写
  • @return对方法返回值的说明,如果方法的返回值类型是void就不能写
  • @exception对方法可能抛出的异常进行说明,如果方法没有用 throws显式抛出的异常就不能写

其中

  • @param@return@exception这三个标记都是只用于方法的。
  • @param的格式要求:@param形参名形参类型形参说明
  • @return的格式要求:@return返回值类型返回值说明
  • @exception的格式要求:@exception异常类型异常说明
  • @param@exception可以并列多个

代码示例:

/**
* @author nemo
* @project_name JavaSenior
* @package_name com.nemo.java
* @create 2020-04-26 10:58
*/
public class AnnotationTest {
/**
*程序的主方法
* @param args 传入命令行参数
*/
public static void main(String[] args) { } /**
* 求圆形面积
* @param radius 所求面积的半径
* @return 面积值
*/
public static double getArea(double radius){
return Math.PI * radius * radius;
}
}

示例二:在编译时进行格式检查(JDK内置的个基本注解)

  • @Override: 限定重写父类方法, 该注解只能用于方法
  • @Deprecated: 用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
  • @SuppressWarnings: 抑制编译器警告

代码示例:

public class AnnotationTest{
public static void mian (String [] args){
@SuppressWarning("unused")
int a = 0;
}
@Deprecated
public void print(){
System.out.print("过时的方法");
}
@Override
public String toString(){
return "重写的toString方法";
}
}

示例三:跟踪代码依赖性,实现替代配置文件功能

在使用Spring框架时会大量用到注解驱动开发。

3. 如何自定义注解

参照@SuppressWarnings定义

  1. 注解声明为:@interface
  2. 内部定义成员,通常使用无参无异常方法value()表示

如果成员只有一个,那么这个成员必须取名为value(),使用时可以忽略成员名和赋值号(=)。

理解:为什么要使用无参无异常方法呢,我认为那是因为,如果使用变量来进行存储的话,在接口中,属性变量会变为常量,占取空间;

而我们这个注解又不是那么的需要这个属性(占空间),只是在属性调用到的时候起作用。

需要在调用的时候才起作用,那肯定是方法比较符合条件了。

记忆:这个注解的使用方式比较类似于方法,如@Params(...),所以里面的注解实现也都用方法value()表示。

  1. 可以指定成员的默认值,使用default定义
  2. 如果自定义注解没成员,表明是一个标识作用。

说明:

  • 如果注解有成员,在使用注解时,需要指明成员的值。
  • 自定义注解必须配上注解的信息处理流程(使用反射)才意义。
  • 自定义注解通过都会指明两个元注解:@Retention@Target

代码举例:

@Inherited
@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE,TYPE_PARAMETER,TYPE_USE})
public @interface MyAnnotation { String value() default "hello";
}

可以看到,注解可以具有数组类型的元素,需要在大括号中指定数组元素的值,数组的元素由逗号分隔。

理解:这个其实也很好理解,可以类比我们的数组初始化,如下。

@ItemList(items = { "A", "B" })

// 数组初始化
String[] strs = {"A", "B"};
String[] strs1 = new String[]{"A", "B"};

4. 元注解:

对现有的注解进行解释说明的注解。

JDK 5.0 提供的4种元注解:

  1. @Retention:指定所修饰的 Annotation 的生命周期:SOURCE\CLASS(默认行为)\RUNTIME。

    source:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略

    class:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期

    runtime:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在

    这3个生命周期分别对应于:Java源文件(.java文件) ---> .class文件 ---> 内存中的字节码。

只有声明为RUNTIME生命周期的注解,才能通过反射获取。

那怎么来选择合适的注解生命周期呢?

首先要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。一般如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,比如生成一些辅助代码(如 ButterKnife),就用 CLASS注解;如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,则可选用 SOURCE 注解。

  1. @Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素

  2. @Documented:表示所修饰的注解在被javadoc解析时,保留下来。
  3. @Inherited:被它修饰的 Annotation 将具继承性。

类比:元数据的概念:String name = "Tom";对现有数据的修饰

5. 如何获取注解信息:

通过反射来进行获取、调用。

前提:要求此注解的元注解Retention中声明的生命周期状态为:RUNTIME.

6. JDK 8.0中注解的新特性:

可重复注解、类型注解

6.1 可重复注解:

  1. 在MyAnnotation上声明@Repeatable,成员值为MyAnnotations.class

  2. MyAnnotation的@Target@Retention等元注解与MyAnnotations相同。

6.2 类型注解:

ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明。)

ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句中。

【Java】枚举类和注解的更多相关文章

  1. Java枚举类、注解和反射

    本文主要介绍的是枚举类,注解和反射.还有一些基础知识:static,基本数据类型,运算符优先级放在文中,以便查阅复习. 其中牵扯到泛型的部分,可参考本人的另一篇博客:(Collection, List ...

  2. Java枚举类和注解梳理

    1. 枚举类 1. 枚举类的使用 枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类. 当需要定义一组常量时,强烈建议使用枚举类. 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. ...

  3. Java枚举类与注解详解——一篇文章读懂枚举类与注解详

    目录 一.枚举类 ① 自定义枚举类 ② enum关键字定义枚举类 ③ enum 枚举类的方法 ④ enum 枚举类实现接口 二.注解 ① 生成文档相关注解 ②注解在编译时进行格式检查 ③注解跟踪代码的 ...

  4. 【Java SE】枚举类和注解

    1.枚举类的使用 当类的对象由有限个,确定的时候,我们称这种类为枚举类.当需要定义一组常量时,建议使用枚举类.而当枚举类中只有一个对象时,可以使用单例模式. 1.1 enmu关键字 省略private ...

  5. Java笔记---枚举类和注解

    Java笔记---枚举类和注解 一.枚举类 自定义枚举类 方式一:JDK5.0之前自定义枚举类 class Seasons { //1. 声明Seasons对象的属性 private final St ...

  6. 【Java基础】枚举类与注解

    枚举类与注解 枚举类的使用 当需要定义一组常量时,强烈建议使用枚举类. 枚举类的理解:类的对象只有有限个,确定的. 若枚举只有一个对象, 则可以作为一种单例模式的实现方式. 枚举类的属性: 枚举类对象 ...

  7. Java枚举类在生产环境中的使用方式

    前言   Java枚举在项目中使用非常普遍,许多人在做项目时,一定会遇到要维护某些业务场景状态的时候,往往会定义一个常量类,然后添加业务场景相关的状态常量.但实际上,生产环境的项目中业务状态的定义大部 ...

  8. Java语法基础学习DayThirteen(枚举类和注解)

    一.枚举类 1.概述:即一个类中只能有有限个对象,若只有一个对象,则可以作为单例模式的一种实现. 2.自定义枚举类(JDK1.5以前这么做) //枚举类 class Season{ //1.提供类的属 ...

  9. java基础---枚举类与注解

    一.枚举类 类的对象只有有限个,确定的.我们称此类为枚举类 如果枚举类中只有一个对象,则可以作为单例模式的实现方式. 定义枚举类 方式一:jdk5.0之前,自定义枚举类 public class Se ...

  10. Java 枚举类

    如果要定义一个枚举类: public enum Size { SAMLL, MEDIUM, LARGE, EXTRA, EXTRA_LARGE}; 实际上,这个声明定义的类型是一个类,它刚好有4个实例 ...

随机推荐

  1. [LC814]二叉树剪枝

    题目 题目地址 分析 这道题符合递归的性质,对于当前的节点node,当且仅当其左右孩子都为不包含1的子树,且node.val=1时,node所在的子树才符合"不包含1的子树"这一定 ...

  2. 史上最全的Cursor IDE教程

    Cursor IDE 使用教程 1. 快速上手 1.1 入门流程 graph TD A[安装Cursor] --> B[首次启动] B --> C[选择主题和配置] C --> D[ ...

  3. Note -「A. Algebra 24 Aut.」“还有一束日光正在为你送达”

      欢迎勘误吖!   喵, 你可以 Ctrl-F 搜 "lww" 获取少量 lww 笑话. (雾   ↓下面这个是我目前用的 LaTeX 宏, 如果需要可以 "Show ...

  4. 分库分表(1) --- ShardingSphere(理论)

    ShardingSphere---理论 ShardingSphere在中小企业需要分库分表的时候用的会比较多,因为它维护成本低,不需要额外增派人手;而且目前社区也还一直在开发和维护,还算是比较活跃. ...

  5. c代码部分封装为lib

    需求:将一个C工程中的核心代码封装为静态文件:lib. 环境 工具:VC6.0++ 语言:c 以封装一个DES工程为例 封装 (1)新建一个静态工程 (2)新建c文件和h文件 (3)挑选封装内容 在原 ...

  6. C#中DevExpress的GridControl相关表格的属性总结

    这里用到了Dev中的GridControl表格做数据查询展示,要求字号大一些,单行选中深色显示 // grid1 this.grid1.Dock = System.Windows.Forms.Dock ...

  7. 优化-iceberg调参优化

    一.建表优化 1.iceberg表支持更新操作. 文档:https://iceberg.apache.org/docs/latest/configuration/ 功能描述:因v1只支持insert, ...

  8. FLink13--KeyByMaxByApp

    一.依赖 https://www.cnblogs.com/robots2/p/16048648.html 二.代码 package net.xdclass.class9; import java.ut ...

  9. CH340区别

    CH340区别 CH340G  USB转串⼝,推出时间最早,需外挂晶振,应⽤最⼴SOP16 CH340C  USB转串⼝,内置晶振,引脚兼容CH340G SOP16 CH340E  USB转串⼝,内置 ...

  10. MybatisPlus - [04] 分页

    limit m,n.PageHelper.MyBatisPlus分页插件 001 || MybatisPlus分页插件 (1)引入maven依赖 <dependency> <grou ...