【Java】枚举类和注解

2023-05-16

目录

一、枚举类的使用

1. 枚举类的说明:

2. 如何自定义枚举类?

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

二、注解的使用

1. 注解的理解

2. 注解的使用示例

3. 如何自定义注解

4. 元注解 :

5. 如何获取注解信息:

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


一、枚举类的使用

1. 枚举类的说明:

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

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

  3. 枚举类的实现:

    JDK 5.0以前需要自定义

    JDK 5.0后新增enum关键字用于定义枚举类

  4. 如果枚举类中只一个对象,则可以作为单例模式的实现方式。

  5. 枚举类的属性:

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

2. 如何自定义枚举类?

步骤:

  1. 私有化构造器,保证不能在类的外部创建其对象;
  2. 在类的内部创建枚举类的示例。声明为:public static final;
  3. 对象如果有实例变量,应该声明为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():返回当前枚举类对象常量的名称

代码示例:

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. 注解的理解

① jdk 5.0 新增的功能

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

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

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

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

2. 注解的使用示例

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

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

  • @author 标明开发该类模块的作者,多个作者之间使用,分割 @version 标明该类模块的版本;

  • @see 参考转向,也就是相关主题;

  • @since 从哪个版本开始增加的;

  • @param 对方法中某参数的说明,如果没有参数就不能写 @return 对方法返回值的说明,如果方法的返回值类型是 void 就不能写 @exception 对方法可能抛出的异常进行说明,如果方法没有用 throws 显式抛出的异常就不能写;

  • 其中 @param 、 @return 和 @exception 这三个标记都是只用于方法的。

  • @param 的格式要求:@param 形参名形参类型形参说明;

  • @return 的格式要求:@return 返回值类型返回值说明;

  • @exception 的格式要求:@exception 异常类型异常说明;

  • @param 和 @exception 可以并列多个;

代码示例:

/**
 * @author bruce
 * @project_name JavaSenior
 * @package_name com.bruce.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表示
  3. 可以指定成员的默认值,使用default定义
  4. 如果自定义注解没成员,表明是一个标识作用。

说明:

  • 如果注解有成员,在使用注解时,需要指明成员的值。

  • 自定义注解必须配上注解的信息处理流程(使用反射)才意义。

  • 自定义注解通过都会指明两个元注解:@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";
}

复制代码

4. 元注解 :

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

JDK 5.0 提供的4种元注解:

  1. @Retention:指定所修饰的 Annotation 的生命周期:SOURCE\CLASS(默认行为)\RUNTIME只有声明为RUNTIME生命周期的注解,才能通过反射获取。
  2. @Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素

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

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

5. 如何获取注解信息:

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

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

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

可重复注解、类型注解

6.1 可重复注解:

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

② MyAnnotation的Target和Retention等元注解与MyAnnotations相同。

6.2 类型注解:

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

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


 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 使用 Guice 注入类集合

    我正在尝试用 Google Guice 2 0 注入东西 我有以下结构 FooAction implements Action BarAction implements Action 然后我有一个带有以下构造函数的 ActionLibrar
  • 如何将变量的全部内容发送/导出到文本文件/xml 文件/剪贴板?

    我想将实例的内容 最好以树形形式 发送给某人 打印屏幕是不行的 因为类太复杂了 您需要将输出转回实例吗 在这种情况下 其他答案都是正确的 如果您只想手动检查实例的内容 理想情况下您的类都将实现toString 你可以将其重定向到一个文件 如
  • android.view.InflateException:二进制 XML 文件行 #11:膨胀类 ImageView 时出错

    我只是尝试制作一个小的 android java xml 应用程序来计算游戏的分数 它给了我这个错误 Error inflateing class ImageView 有人知道解决方案吗 我实际上搜索了 ppl 说添加这个 android
  • 如何将 JSpinner 的值设置为特定日期

    我有一个JSpinner我添加到JPanel我想将其时间设置为 GregorianCalendar calendar JSpinner spinner new JSpinner spinner setModel model pom add
  • 如何配置 Spring-WS 以使用 JAXB Marshaller?

    感谢您到目前为止对此的帮助 我正在更新问题 因为我没有显示我需要的所有内容 并显示了建议的更改 肥皂输出仍然不是我想要的 servlet xml
  • GET 请求的 Spring 注解

    这两种spring GET方法有什么区别呢 哪一种是首选方法 Component Scope request Path public class TestComponent GET Path hello public String prin
  • 迁移到Java 9或更高版本时是否需要切换到模块?

    我们目前正在从 Java 8 迁移到 Java 11 但是 升级我们的服务并没有我们预期的那么痛苦 我们基本上只需要更改我们的版本号build gradle文件和服务都顺利启动并运行 我们升级了库以及使用这些库的 微 服务 到目前为止没有问
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac
  • java中的单链表和双向链表?

    在java中 哪个集合接口可以有效地实现单链表和双向链表 请问代码示例吗 毫不奇怪 实现双向链表的正确接口是 LinkedList 看Java文档 http docs oracle com javase 8 docs api java ut
  • 正则表达式在 Velocity 模板中不起作用

    我在 Test java 中尝试过这个 String regex lt s br s s gt String test1 lt br gt System out println test replaceAll regex 但是当我在速度模板
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 从 HttpClient 3 转换为 4

    我已经成功地对所有内容进行了更改 但以下内容除外 HttpClient client HttpPost method client new DefaultHttpClient method new HttpPost url InputStr
  • 如何使用 swagger-codegen-plugin (maven) 生成客户端代码?

    我需要使用 swagger codegen plugin for maven 在 eclipse 中生成服务器存根代码 你能帮忙怎么做吗 以及需要什么配置 在 pom xml 中 我找到了这个答案 您只需要像下面这样更改 pom xml 即
  • 改变 Java 中凯撒移位的方向

    用户可以通过选择 1 向左或 2 向右移动字母来选择向左或向右移动 左边工作正常 右边不行 现在它显示了完全相同的循环 但我已经改变了所有 and 以不同的方式进行标记 最终我总是得到奇怪的字符 如何让程序将字符向相反方向移动 如果用户输入
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • 配置jmxremote时无法正常停止tomcat

    我添加了一个jmxremotecatalina bat中的配置 set JAVA OPTS Dcom sun management jmxremote port 9004 Dcom sun management jmxremote ssl
  • java swing:向 JTree 项目添加自定义图形按钮

    我想在 JTree 中的项目右侧添加一个带有小图标的附加按钮 这可以做到吗 如果是这样 怎么办 thanks Clamp 你在这方面成功了吗 我想做同样的事情 但很难让 JButton 响应用户 设置渲染器以显示按钮的过程很顺利 但所有鼠标
  • JPA 将 BigDecimal 作为整数保存在数据库中

    我在数据库中有这个字段 ITEMCOST NUMERIC 13 DEFAULT 0 NOT NULL 在JAVA中 Entity中的字段定义如下 Column name ITEMCOST private BigDecimal itemCos
  • 在 Freemarker 模板中检查 Spring 安全角色和记录的用户名

    有谁知道 freemarker 标签来检查 freemarker 文件中的 spring 安全角色和用户名 我从网络上的几个资源中发现以下代码将打印登录的用户名 但它没有打印用户名 而是打印 登录为
  • 将数组值导出到 csv 文件 java

    我只需要帮助将数组元素导出到 csv 文件 我不知道我的代码有什么问题 任何帮助将不胜感激 谢谢 for int index 0 index lt cols length index FileWriter fw new FileWriter

随机推荐

  • 机器学习与R语言 多元线性回归insurance.R:保险费

    insurance lt read csv 34 insurance csv 34 stringsAsFactors 61 TRUE str insurance 既然因变量是charges 我们就来看一下它是如何分布的 summary in
  • 各种假设检验实例整理 R语言

    http www cnblogs com ywliao archive 2017 04 17 6724334 html
  • 人机交互大作业考核要求

    考试说明 根据课程特点 xff0c 考试采取大作业形式 为了考试学生的对课程基本理论 基本知识点的考察 xff0c 要求学生调查报告中必须满足下述文档描述要求 xff1b 同时 xff0c 为了充分发挥学生的自我能动性 积极性 创造性 xf
  • 5.2 Great minds think alike!

    So far so good 过得去 xff1b 到目前为止 xff0c 一直都还不错 例句 xff1a The work is rather difficult but so far so good 工作相当困难 xff0c 但到目前为此
  • 统计建模与R软件-第六章 回归分析

    6 1为了估计山上积雪融化后对下游灌溉的影响 xff0c 在山上建立一个观测站 xff0c 测量最大积雪深度X与当年灌溉面积Y xff0c 测得连续10年的数据如表6 17所示 表6 17 10年中最大积雪深度与当年灌溉面积的数据 序号 X
  • 数据降维之主成分分析

    信息过度复杂是多变量数据最大的挑战之一 主成分分析和探索性因子分析是两种用来探索和简化多变量复 杂关系的常用方法 主成分分析 xff08 PCA xff09 是一种数据降维技巧 xff0c 它能将大量相关变量转化为一组很少的不相关变量 xf
  • C/C++复习

    1 C传送参数 xff1a 两种 xff1a 值传递 xff0c 引用传递 xff1a 如下测试code void valuepass int x x 61 x 43 10 void pointerpass int x x 61 x 43
  • 主成分分析之法国经济分析数据详解

    用数据框的形式输入数据 conomy lt data frame x1 61 c 149 3 161 2 171 5 175 5 180 8 190 7 202 1 212 4 226 1 231 9 239 0 x2 61 c 4 2 4
  • 朴素贝叶斯 手机垃圾信息过滤 机器学习与R语言

    Chapter 4 Classification using Naive Bayes Example Filtering spam SMS messages Step 2 Exploring and preparing the data r
  • 子网掩码和IP地址计算网络地址和广播地址的换算

    子网掩码和IP地址计算网络地址和广播地址的换算 已知 IP地址为 xff1a 202 112 14 137 子网掩码 xff1a 255 255 255 224 要求计算出这台主机所在的网络地址和广播地址是 xff1f 解 xff1a 第一
  • 手机浏览器查看vue项目

    在手机浏览器上面我们可以直接查看vue项目 在有网的条件下 xff0c 我们使用指令npm run serve启动一个项目 xff0c 会出现两个网址 xff0c 一个是本地的 xff0c 一个是网络的 在手机浏览器地址栏输入第二个网址 x
  • STM32 HAL库IIC驱动

    1 STM32上IIC的一些争议 关于STM32的IIC驱动 xff0c 网上有很多争论 xff0c 究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢 xff1f 下面这个图形象展示了这些争论 总结一些 xff1a ST为
  • 怎么看jdk的安装路径

    首先 xff0c 先来说下第一种情况 已经安装好了jdk xff0c 也配置了环境变量 xff0c 这种情况下 xff0c 查看jdk路径是很容易的 在window环境下 xff0c 我们先执行java version 指令查看是否已经配置
  • c总结 使用scanf输入字符串问题

    学习c时经常遇到字符串的输入问题 xff0c 使用scanf输入时总是会或多或少的遇到错误 xff0c 总结一下我遇到过的情况 同时输入字符和字符串 刚开始编写时可能大多数会这样写 xff1a xff08 ch1为字符类型的数组 xff0c
  • VCPKG安装和使用教程

    文章目录 1 安装2 使用命令选项 3 集成vcpkgWindows 上的 Visual Studio 集成Linux 或 macOS 上的 Visual Studio Code 集成删除 vcpkg 集成 使用举例4 详细介绍4 1 新增
  • docker中debian系统更换阿里云镜像源

    今天在docker中的debian系统中执行apt get update的时候 xff0c 看到一些无法连接http deb debian org源的错误 xff0c 如下 apt get span class hljs operator
  • 【Java】中常用类

    目录 一 String类 xff08 一 xff09 概述 xff08 二 xff09 String的特性 1 String的不可变性 2 String实例化方法 3 字符串拼接方式赋值对比 4 String使用陷阱 5 String类常用
  • golang如何执行脚本并获取返回值

    golang中如何执行脚本并获取返回值 调用脚本 在golang标准库中提供了两种方式可以用来启动进程调用脚本 第一种是在os库中的Process类型 xff0c Process类型包含一系列方法用来启动进程并对进程进行操作 xff08 参
  • Spring的Bean加载流程

    Spring IOC容器就像是一个生产产品的流水线上的机器 xff0c Spring创建出来的Bean就好像是流水线的终点生产出来的一个个精美绝伦的产品 既然是机器 xff0c 总要先启动 xff0c Spring也不例外 因此Bean的加
  • 【Java】枚举类和注解

    目录 一 枚举类的使用 1 枚举类的说明 xff1a 2 如何自定义枚举类 xff1f 3 JDK 5 0 新增使用enum定义枚举类 二 注解的使用 1 注解的理解 2 注解的使用示例 3 如何自定义注解 4 元注解 xff1a 5 如何