欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java基础编程-枚举类与注解

程序员文章站 2024-03-11 22:15:49
...

本文全文参考 https://www.bilibili.com/video

枚举类

1. 枚举类的说明:

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

2. jdk 5.0 之前自定义枚举类

public class SeasonTest {
    public static void main(String[] args) {
        Season spring = Season.SPRING;
        String seasonName = spring.getSeasonName();
        System.out.println(seasonName); // 春天
        System.out.println(spring.toString()); // Season{seasonName='春天', seasonDesc='春天到了'}
    }
}

//  jdk 5.0 之前自定义枚举类
class Season{

    // 1.声明Season对象的属性
    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.其他诉求1:获取枚举类对象的属性
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }

    // 4.其他诉求2:提供toString()方法
    @Override
    public String toString() {
        return "Season{" +
                "seasonName='" + seasonName + '\'' +
                ", seasonDesc='" + seasonDesc + '\'' +
                '}';
    }
}

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

//  jdk 5.0 新增使用enum定义枚举类。
enum Season1{

    SPRING("春天","春天到了"),
    SUMMER("夏天","夏天到了"),
    AUTUMN("秋天","秋天到了"),
    WINTER("冬天","冬天到了");

    private final String seasonName;
    private final String seasonDesc;

    Season1(String seasonName, String seasonDesc) {
        this.seasonName = seasonName;
        this.seasonDesc = seasonDesc;
    }
    public String getSeasonName() {
        return seasonName;
    }
    public String getSeasonDesc() {
        return seasonDesc;
    }
}

4. 使用enum定义枚举类之后,枚举类常用方法:(继承于java.lang.Enum类)

Java基础编程-枚举类与注解

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

注解

1. 注解的理解

Java基础编程-枚举类与注解

2. 注解的使用示例

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

Java基础编程-枚举类与注解

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

Java基础编程-枚举类与注解

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

Java基础编程-枚举类与注解

3. 如何自定义注解

Java基础编程-枚举类与注解

4. 元注解 :对现有的注解进行解释说明的注解。

  • 元注解:对现有注解进行解释说明的注解
  • 元数据:对现有数据进行修饰的数据
    Java基础编程-枚举类与注解
  • 示例:Override 注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

Java基础编程-枚举类与注解
Java基础编程-枚举类与注解
Java基础编程-枚举类与注解

5. 如何获取注解信息

  • 通过发射来进行获取、调用。
  • 前提:要求此注解的元注解Retention中声明的生命周期状态为:RUNTIME.

6.JDK8中注解的新特性

6.1 可重复注解
  • 下面是JDK8中的重复注解( java.lang.annotation.Repeatable)定义的源码。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
    Class<? extends Annotation> value();
}
  • 重复注解,即一个注解可以在一个类、方法或者字段上同时使用多次,如Spring中可以使用多个扫描组件来扫描多个包的注解。
@ComponentScan
@ComponentScan
public class Configuration{
}
  • ComponentScan的源码。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
  • ComponentScans的源码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
...
  • 下面来演示下重复注解的实现。
public static void main(String[] args) {
    for (Token token : UserToken.class.getAnnotationsByType(Token.class)) {
        System.out.println(token.value());
    }
}
 
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Tokens {
    Token[] value();
}
 
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Tokens.class)
public @interface Token {
    String value();
}
 
@Token("666666")
@Token("888888")
public interface UserToken {
}
  • 输出结果:

666666
888888
6.2 类型注解

Java基础编程-枚举类与注解