文章目录

  • 枚举
    • 枚举类说明
    • 枚举类的使用:入门
    • 枚举类的主要方法
    • 实现接口
  • 注解
    • 常见示例
      • 示例一:生成文档相关注解
      • 示例二:在编译时进行格式检查(JDK内置的三个基本注解)
      • 示例三:跟踪代码依赖性,实现替代配置文件功能
    • 自定义注解
    • 元注解
    • JDK 8 注解新特性

如何自定义枚举类
如何使用关键字enum定义枚举类
Enum类的主要方法
实现接口的枚举类

枚举

枚举类说明

枚举类实现

  • JDK1.5之前,需要自定义枚举类
  • JDK1.5新增的enum关键字用于定义枚举类
    若枚举只有一个对象,则可以作为一种单例模式的实现方式

枚举类的属性

  • 枚举类对象的属性不应允许被改动,所以应该使用 private final 修饰
  • 枚举类的使用 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 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;}@Overridepublic String toString() {return "Season{" +"seasonName='" + seasonName + '\'' +", seasonDesc='" + seasonDesc + '\'' +'}';}
      }public class test01{@Testpublic void demo1(){Season spring = Season.SPRING;System.out.println(spring);System.out.println(spring.getSeasonName() + "   " +spring.getSeasonDesc());}
      }
      
      public class test02 {@Testpublic void demo(){Status busy = Status.BUSY;System.out.println(busy);System.out.println(busy.getNAME());}
      }/*** 自定义枚举类*/
      class Status{//1. 声明Status属性,private final修饰,成员常量private final String NAME;//2. 提供构造方法,为属性初始化public Status(String NAME) {this.NAME = NAME;}//3. 提供枚举对象public static final Status FREE = new Status("FREE");public static final Status BUSY = new Status("BUSY");public static final Status VOCATION = new Status("VOCATION");//4. 提供获取属性的方法public String getNAME() {return NAME;}@Overridepublic String toString() {return NAME;}
      }
      
    • 方式二:

      /*** 使用enum关键字定义枚举类* 说明:定义的枚举类默认继承与java.lang.Enum类**/
      public enum Season2 {//1. 提供当前枚举类的对象,多个对象用","隔开,末尾对象";"结束 默认是public static final 修饰SPRING("spring","春"),SUMMER("summer","夏"),AUTUMN("autumn","秋"),WINTER("winter","冬");//2. 声明 对象属性:private final修饰 (默认无修饰)private final String seasonName;private final String seasonDesc;//3. 私有化构造器,并给对象属性赋值(默认就是private 修饰)Season2(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(String str):可以吧字符串转为对应的枚举类对象。要求字符串必须是枚举类对象,否则抛异常
toString(): 返回当前枚举类对象常量的名称

    @Testpublic void demo4(){//values()Season2[] values = Season2.values();for (int i = 0; i < values.length; i++) {System.out.println(values[i]);}//SPRING//SUMMER//AUTUMN//WINTERThread.State[] values1 = Thread.State.values();for (int i = 0; i < values1.length; i++) {System.out.println(values1[i]);}//NEW//RUNNABLE//BLOCKED//WAITING//TIMED_WAITING//TERMINATED//************************//valueOf(String objName)//如果没有objName的枚举对象,抛异常IllegalArgumenExceptionSeason2 winter = Season2.valueOf("WINTER");System.out.println(winter);}

实现接口

/*** 实现接口*/
public class test5 {@Testpublic void demo(){Season3.SPRING.show();Season3.WINTER.show();}
}public interface info {void show();
}public enum Season3 implements info {//每个枚举对象都可以重写接口中的方法,同时也可以覆盖本类中的方法SPRING("spring", "春"){@Overridepublic void show() {System.out.println("我是春天,我不一样");}},SUMMER("summer", "夏"),AUTUMN("autumn", "秋"),WINTER("winter", "冬");private final String seasonName;private final String seasonDesc;Season3(String seasonName, String seasonDesc) {this.seasonName = seasonName;this.seasonDesc = seasonDesc;}public String getSeasonName() {return seasonName;}public String getSeasonDesc() {return seasonDesc;}//枚举类重写接口中的方法@Overridepublic void show() {System.out.println("一年四季");}
}

注解

概述
常见的示例
自定义注解
JDK元注解
利用反射获取注解信息(在反射部分涉及)
JDK8中注解的新特性

  • 在JavaSE中,注解的使用目的比较简单,例如标记过时功能,忽略警告等。
  • 在JavaEE/Android中注解占据了重要角色,例如配置应用程序的任何切面,代替JavaEE旧版遗留的繁冗代码和XML配置等。
  • 未来的开发模式都是基于注解的,JPA是基于注解的,spring,Mybatis,Hibernate3.x,struts2等,注解是一种趋势,一定程度上可以说:框架 = 注解 + 反射 +设计模式

常见示例

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

@author 作者,多个作者用","分割
@version
@see 参考转向
@since 从哪个版本开始增加
@param 参数
@return 返回值
@exception 异常
@throws 和@excepton 同意

package com.annotation.javadoc;
/*** @author shkstart* @version 1.0* @see Math.java*/
public class JavadocTest {/*** 程序的主方法,程序的入口* @param args String[] 命令行参数*/public static void main(String[] args) {}/*** 求圆面积的方法* @param radius double 半径值* @return double 圆的面积*/public static double getArea(double radius){return Math.PI * radius * radius; }
}

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

@Override :限定重写父类方法
@Deprecated 已过时
@SuppressWarnings : 抑制编译器警告

package com.annotation.javadoc;
public class AnnotationTest{public static void main(String[] args) {@SuppressWarnings("unused")int a = 10;}@Deprecatedpublic void print(){System.out.println("过时的方法");}@Overridepublic String toString() {return "重写的toString方法()"; }
}

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


自定义注解

  • 定义注解使用 @interface关键字
  • 自动继承java.lang.annotation.Annotation接口
  • 注解成员:以无参方法形式声明。方法名,返回值定义类该成员的名字和类型。我们称为配置参数
    类型只能是:基本数据类型、String、Class、enum、Annotation、以上所有类型数组
  • 可以在定义 注解 的成员变量时为其指定初始值,指定成员变量初始值可以使用default 关键字
  • 如果只有一个参数成员,建议使用 value
  • 如果定义的注解含有配置参数,那么使用时必须指定参数值,除非它有默认值。格式是"参数名 = 参数值",如果只有一个参数成员,且名称为 value,可以省略 ”value=“
  • 没有成员定义的 注解 称为标记;包含成员变量的 注解称为元数据 注解

注意:自定义注解必须配上注解的信息处理流程才有意义
自定义注解,通常会指明两个注解:Retention、Target

import java.lang.annotation.*;@MyAnnotation
public class test1 {public static void main(String[] args) {Class<test1> test1Class = test1.class;MyAnnotation annotation = test1Class.getAnnotation(MyAnnotation.class);String value = annotation.value();System.out.println(value);}
}@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation{String value() default "zs";
}

元注解

对现有注解进行说明的注解
Retention
Target
Documented
Inherited

@Retention: 只能用于修饰一个 Annotation 定义,用于指定该 Annotation的生命周期,
@Rentention,包含一个RetentionPolicy类型的成员变量,使用@Rentention时必须为该value成员变量指定值:

  • RetentionPolicy.SOURCE:在源文件中有效
  • RetentionPolicy.CLASS:在class文件中有效
  • RetentionPolicy.RUNTIME: 在运行时有效,反射处理信息

@Target:指明自定义注解可修饰的位置

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

JDK 8 注解新特性

可重复注解:在需要重复的注解上添加 @Repeatable(关联注解类型)

被关联注解需要有相同的 Retention , Target,inherited
被关联注解中需要声明属性为关联注解类型的数组

类型注解:
TYPE_PARAMETER: 泛型注解
TYPE_USE:类型注解

第八章 ---- 枚举注解相关推荐

  1. Java 枚举注解反射

    4-9 枚举&注解&反射 枚举 引入的目的:用于定义有限数量的一组同类常量,限定了使用者在使用时常量的取值范围. Java中枚举的演变: java1.5前使用类+final修饰变量+私 ...

  2. java 枚举 注解_Java枚举类和注解梳理

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

  3. JavaSE - 14 枚举 + 注解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1.枚举 1.1 概述 1.2 枚举的定义格式 1.3 枚举常用的方法 2.注解 2.1 注解概述 2.2 自定义注解 2. ...

  4. Java学习笔记day26-xml枚举注解

    XML ​ XML是一种可扩展的标记语言:标签语言是通过标签来描述数据的一门语言:可扩展是指标签的名字是可以自定义的. 作用: 用于存储数据和传输数据 作为软件的配置文件 XML标签规则 XML语法规 ...

  5. 枚举注解反射整合详解

    一丶枚举 1 ** 2 * 一.枚举类的使用 3 * 1.枚举类的理解:类的对象只有有限个,确定的.我们称此类为枚举类 4 * 2.当需要定义一组常量时,强烈建议使用枚举类 5 * 3.如果枚举类中只 ...

  6. 枚举 注解 常量的使用区别

    虽然我今天要打脸,介绍如何使用注解,慎用枚举,但其实在之前的文章最后,我很明显的提议大家分场景的使用: 最后,声明一点,我所说的使用枚举替换常量,是针对类似于 "常量之间存在关联" ...

  7. C#图解教程 第十八章 枚举器和迭代器

    枚举器和迭代器 枚举器和可枚举类型 第12章中,我们看到可以用foreach语句遍历数组.在本章,我们会进一步探讨数组,来看看为什么它们可以被foreach语句处理.我们还会研究如何使用迭代器为用户自 ...

  8. Android快速开发整理(库、插件,kotlin枚举注解

    RxAndroid implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' Github:https://github.com/ReactiveX/ ...

  9. 第七章、 面向对象基础--下(续) 内部类、枚举、注解

    文章目录 内容 学习目标 第七章 面向对象基础--下(续) 7.7 内部类 7.7.1 概述 7.7.1 非静态成员内部类 练习1:语法练习题 练习2:简单面试题 练习题3:高难面试题 7.7.2 静 ...

最新文章

  1. struts基本原理图
  2. js输出一个菱形_Threejs使用菱形正方形算法,中点替换算法生成随机地形
  3. 【Linux多线程】三个经典同步问题
  4. SVM 实现与代码(转)
  5. 资讯|WebRTC M94 更新
  6. mysql decimal(6_MySQL(六) decimal数据默认处理
  7. 热血上头!程序员想拍桌子离职的1000个瞬间...
  8. UVA 10624 Super Number
  9. 刷屏!黄晓明杨颖官宣离婚,两人已无商业关联
  10. 4、Spring配置中的classpath:与classpath*:的区别
  11. Tomcat服务器报错IOException: Broken pipe
  12. 内置函数(内嵌函数或内联函数)
  13. linux恢复树莓派内存卡容量,找回树莓派SD卡剩余空间
  14. Leetcode 1284 Minimum Number of Flips to Convert Binary Matrix to Zero Matrix
  15. 安装apk文件到linux,linux系统如何安装apk文件
  16. 微信小程序表单必填项设置
  17. 叉乘点乘混合运算公式_小学数学所有公式和顺口溜都在这里了,考试肯定能用到!...
  18. UVALive 7269 Snake Carpet
  19. 数学基础task08 二重积分
  20. 知识图谱 语义网络,语义网,链接数据和知识图谱 (二)--基础篇

热门文章

  1. 【报告分享】2020全球网络趋势报告.pdf(附下载链接)
  2. PyTorch实战福利从入门到精通之六——线性回归
  3. 腾讯广告招人啦,校招优质岗位你不容错过!
  4. 漫谈广告竞价模式(四)
  5. Leetcode每日一题:416.partition-equal-subset-sum(分割等和子集)
  6. Typora导出PDF时一直处于正在导出的状态
  7. 人生第一个深入理解的DFS题 HDU 1016
  8. 设计模式快速学习(五)原型模式
  9. datatable某一行第N列为空的时候删除某一行
  10. LeetCode刷题(48)--Remove Duplicates from Sorted List II