1. 枚举类

1. 枚举类的使用

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

1.2 如何定义枚举类

  • 方式一:JDK1.5之前,自定义枚举类;
  • 方式二:JDK1.5之后,可以使用enum关键词定义枚举类。

自定义枚举类的三个原则:

  1. 私有化类的构造器,保证不能再类的外部创建其对象;
  2. 在类的内部创建类枚举类的实例。声明为:public static final
  3. 对象如果有实例变量,应该声明为private final,并在构造器中初始化。

自定义枚举类举例:SeasonTest类

package com.atguigi.java;

public class SeasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
System.out.println(spring); // Season{seasonName='春天', seasonDesc='春暖花开'}
}
} // 自定义枚举类
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. 其他诉求:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
} public String getSeasonDesc() {
return seasonDesc;
}
// 5. 其他诉求:提供toString
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}

1.3 使用enum关键字定义枚举类

package com.atguigi.java;

/**
* 使用enum关键字定义枚举类
* 说明:定义的枚举类默认继承于java.lang.Enum类
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 summer = Season1.SUMMER;
System.out.println(summer); // Season1{seasonName='夏天', seasonDesc='夏日炎炎'} System.out.println(Season1.class.getSuperclass()); // class java.lang.Enum
}
} //使用enum关键字枚举类
enum Season1{
// 1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
SPRING ("春天", "春暖花开"),
SUMMER("夏天", "夏日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "冰天雪地"); // 2. 声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc; // 3. 私有化类的构造器,并给对象属性赋值
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
} // 4. 其他诉求:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
} public String getSeasonDesc() {
return seasonDesc;
}
// 5. 其他诉求:提供toString @Override
public String toString() {
return "Season1{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
  • 使用enum关键字定义枚举类时,如果没有重写toString(),那么下面的代码执行的是结果是SUMMER。

    Season1 summer = Season1.SUMMER;
    System.out.println(summer);

1.4 Enum类的常用方法

 Season1 summer = Season1.SUMMER;

//toString():返回枚举类对象的名称
System.out.println(summer.toString()); System.out.println("****************"); //values():返回所有的枚举类对象构成的数组
Season1[] values = Season1.values();
for(int i = 0;i < values.length;i++){
System.out.println(values[i]);
//values[i].show();
}
System.out.println("****************"); //valueOf(String objName):返回枚举类中对象名是objName的对象。
Season1 winter = Season1.valueOf("WINTER"); // Season1{seasonName='冬天', seasonDesc='冰天雪地'}
//如果没有objName的枚举类对象,则抛异常:IllegalArgumentException
// Season1 winter = Season1.valueOf("WINTER1");
System.out.println(winter);

1.5 枚举类实现接口

  • 情况一:实现接口,在enum类中实现抽象方法,跟普通的实现接口方式一样。
  • 情况二:实现接口后,每个对象重写方法,从而实现每个对象调用同一方法产生不同结果。

定义接口Info,接口中定义方法show()。枚举类中的每个对象实现重写show()方法。实现的结果是不同的枚举类对象电泳同一个方法得到不同结果。

package com.atguigi.java;

/**
* 使用enum关键字定义枚举类
* 说明:定义的枚举类默认继承于java.lang.Enum类
*/
public class SeasonTest1 {
public static void main(String[] args) {
Season1 summer = Season1.SUMMER;
summer.show(); // 宁夏
Season1 winter = Season1.valueOf("WINTER");
winter.show(); // 大约在冬季
}
} 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("大约在冬季");
}
}; // 2. 声明Season对象的属性:private final修饰
private final String seasonName;
private final String seasonDesc; // 3. 私有化类的构造器,并给对象属性赋值
private Season1(String seasonName, String seasonDesc){
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
} // 4. 其他诉求:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
} public String getSeasonDesc() {
return seasonDesc;
}
// 5. 其他诉求:提供toString @Override
public String toString() {
return "Season1{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}

2. 注解

2.1 注解的理解

  • 从JDK5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。

  • Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,,在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。

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

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

  • 框架 = 注解 + 反射 + 设计模式

2.2 常用Annotation使用

  1. 生成文档相关注解;
  2. 在编译时进行格式检查(JDK内置的三个基本注解)
    • @Overrive:限定重写父类的方法,该注解只能用于方法;
    • @Deprecated:用于表示所修饰的元素(类、方法)已过时,通常是因为所修饰的结构危险或存在更好的选择;
    • @SuppressWarning:抑制编译器警告。
  3. 跟踪代码依赖性,实现替代配置文件的功能
  • Servlet3.0提供了注解,使得不在需要在web.xml文件中进行Servlet得部署。

  • Spring框架中关于“事务”的管理

2.3 如何自定义注解

  • 定义新的Annotation类型使用@interface关键字
  • 自定义注解自动实现了java.lang.annotation.Annotation接口;
  • Annotation的成员变量在Annotation定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名称和类型;
  • 可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可以是使用default关键字;
  • 如果只有一个参数成员,建议使用参数名为value;
  • 没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation。
  • 注意:自定义注解必须配上注解的信息处理流程(使用反射)才有意义。
package java.atguigu.java1;

public @interface MyAnnotation {
String value() default "hello";
}

2.4 JDK中的元注解

JDK中的元Annotation用于修饰其他Annotation定义,JDK5.0中提供了4个标准的meta-annotation类型,分别是:

Retention、Target、Documented、Inherited。

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

    • RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注解;
    • RetentionPolicy.CLASS:在class文件中有效(即class保留),当运行程序时,JVM不会保留注解。这是默认值
    • RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行 Java程序时,JVM会保留注解。程序通过反射获取该注解。
    public enum RetentionPolicy{
    SOURCE,
    CLASS,
    RUNTIME
    }
  • @Target:用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素。@Target也包含一个名为value的成员变量。

2.5 JDK8中注解的新特性

Java8对注解处理提供了两点改进:可重复的注解和可用于类型的注解。此外,反射也得到了加强,在Java8中能够得到方法参数的名称。这会简化标注在方法参数上的注解。

  • 可重复注解示例:

  • 类型注解

    • JDK8之后,关于元注解@Target的参数类型ElementType枚举值多了两个:TYPE_PARAMETER,TYPE_USE。
    • 在Java8之前,注解只能在声明的地方使用,Java8开始,注解可以应用在任何地方。
    • ElementType.TYPE_PARAMETER表示该注解能写在类型变量的声明语句中(如:泛型声明)。
    • ElementType.TYPE_USE表示该注解能写在使用类型的任何语句中。
public class TestTypeDefine<@TypeDefine() U> {
private U u;
public <@TypeDefine() T> void test(T t){
}
}
@Target({ElementType.TYPE_PARAMETER})
@interface TypeDefine{
}
@MyAnnotation
public class AnnotationTest<U> {
@MyAnnotation
private String name;
public static void main(String[] args) {
AnnotationTest<@MyAnnotation String> t = null;
int a = (@MyAnnotation int) 2L;
@MyAnnotation
int b = 10;
}
public static <@MyAnnotation T> void method(T t) {
}
public static void test(@MyAnnotation String arg) throws @MyAnnotation Exception {
}
}
@Target(ElementType.TYPE_USE)
@interface MyAnnotation {
}

Java枚举类和注解梳理的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. Java 枚举类

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

  9. java 枚举类 enum 总结

    枚举定义: enum是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量 ...

随机推荐

  1. 路径规划: PRM 路径规划算法 (Probabilistic Roadmaps 随机路标图)

    随机路标图-Probabilistic Roadmaps (路径规划算法) 路径规划作为机器人完成各种任务的基础,一直是研究的热点.研究人员提出了许多规划方法如: 1. A* 2. Djstar 3. ...

  2. cent os 部署blade

    一:安装docker 二:安装docker-compose 三:安装Harbor 四:配置Harbor使用https和2376端口 在/etc/docker 目录下面创建文件:create_tls_c ...

  3. 微信小程序框架 同时兼容QQ小程序

    最近一直在开发微信小程序,经过几个版本的迭代开发,代码终于能够达到框架级别,动态配置.除了界面有些寒酸以外,功能上还是挺完备的. 主要有以下特点 1.整个程序所需url地址均在api.js中定义,环境 ...

  4. EasyNVR摄像机网页无插件直播方案H5前端构建之:bootstrap弹窗功能的实现方案与代码

    前言介绍 在web前端的网页设计中,为了展示出简洁的网页风格和美观的效果,往往会使用弹窗效果在EasyNVR前端页面录像检索功能时,必然会播放录像,如果单独为播放录像文件排一个界面,用户在使用上会更加 ...

  5. kubernetes之Scheduler原理分析

    scheduler在整个系统承担了承上启下的重要功能 承上值负责接受Controller Manager创建新的pod,安排目标Node 旗下指安置工作完成后,目标Node上的kubelet服务进程接 ...

  6. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

  7. 【Docker学习之二】Docker部署安装

    环境 docker-ce-19.03.1-3.el7.x86_64 一.Docker的部署安装 Docker采用Linux(内核)技术,所以只能运行在Linux上,官方说Linux kernel至少3 ...

  8. ubantu系统安装ssh

    ssh连接ubantu系统 描述:新安装的ubantu系统,ssh连接发现22端口拒绝,登陆服务器发现没有ssh 1.安装ssh服务 apt-get install openssh-server 报错 ...

  9. SpringBoot集成Mybatis实现多表查询的两种方式(基于xml)

     下面将在用户和账户进行一对一查询的基础上进行介绍SpringBoot集成Mybatis实现多表查询的基于xml的两种方式.   首先我们先创建两个数据库表,分别是user用户表和account账户表 ...

  10. DRF框架(八)——drf-jwt手动签发与校验、搜索过滤组件、排序过滤组件、基础分页组件

    自定义drf-jwt手动签发和校验 签发token源码入口 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口,不然进不了登录页面 获取提交的username ...