一、枚举类的使用

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. DevOps 企业级 CI/CD 实战 —— 整合 GitLab+Jenkins+Harbor+Docker 实现代码全自动化流程管理

    前言 随着 AI 人工智能.云计算.Docker.K8S 等容器技术等的发展,DevOps 得到了广泛的应用和推广,CI / CD ( 持续集成 / 持续部署 )等概念不断深化和完善.CI/CD 是现 ...

  2. 如何发现漏洞之我的多功能武器BurpSuite与全能插件

    知识点 1.插件类-武装BurpSuite-漏洞检测&分析辅助 2.插件类-武装谷歌浏览器-信息收集&情报辅助 一.演示案例-插件类-武装BurpSuite-漏洞检测&分析辅助 ...

  3. 学Shiro完结版-3

    第八章 拦截器机制--<跟我学Shiro> 8.1 拦截器介绍 Shiro使用了与Servlet一样的Filter接口进行扩展:所以如果对Filter不熟悉可以参考<Servlet3 ...

  4. postman环境设置以及参数传递

    通常一个公司项目有不同的环境(开发环境,测试环境,上线环境),在做测试时候,有可能会遇到接口改变之类的,postman保存了很多接口,想要再测试局需要多次修改域名或者端口,这个时候就需要配置环境 1. ...

  5. dart集合list方法详解

    List数组有两种声明方式: 01==>List 常用的属性==> length 计算数组的长度 reversed 数组翻转 isEmpty 是否为空 isNotEmpty 是否不为空 L ...

  6. Java02-基础语法

    Java基础语法 [ 任务列表 ] 1.注释 2.字面量 3.变量 4.关键字.标识符 5.方法 6.类型转换 7.输入输出 8.运算符 9.其他 -------------------------- ...

  7. Transaction rolled back because it has been marked as rollback-only问题解决

    1.背景 在我们的日常开发中,经常会存在在一个Service层中调用另外一个Service层的方法.比如:我们有一个TaskService,里面有一个execTask方法,且这个方法存在事务,这个方法 ...

  8. 央国企“严选”!天翼云夺得IaaS+PaaS市场桂冠!

    10月17日,赛迪顾问发布的<2024中国央国企云市场研究报告>显示,2023年,在中国央国企云"IaaS+PaaS"市场中,中国电信天翼云凭借行业云和全栈服务能力.渠 ...

  9. 寻找AI新势力!“天翼云息壤杯”高校AI大赛火热报名中!

    各位高校开发者们, AI舞台已就位,你准备好了吗? 为加快落实"人工智能+"行动,中国电信集团有限公司充分发挥央企在人工智能领域主力军作用,联合华为技术有限公司共同举办" ...

  10. 使用MTR网络诊断

    安装 MTR Ubuntu: apt update apt upgrade apt install mtr-tiny CentOS: yum update yum install mtr 使用 MTR ...