0%

【Java基础】枚举类与注解

学习枚举类与注解整理的学习笔记

一、枚举类

1.1 说明

  • 类的对象只有有限个,确定的。称这种类为枚举类
  • 当需要定义一组常量时,强烈建议使用枚举类

1.2 枚举类定义

  • 方式一:JDK5.0之前,自定义枚举类
    • 1.定义类的属性:用private final 来修饰
    • 2.构造器私有化,并带参对类的属性进行赋值
    • 3.创建对象(public static final)
    • 4.(可选)提供类的属性get方法,以及重写toString方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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.获取枚举类的属性,提供toString方法
public String getSeasonName() {
return SeasonName;
}
public String getSeasonDesc() {
return SeasonDesc;
}
@Override
public String toString() {
return "Season{" +
"SeasonName='" + SeasonName + '\'' +
", SeasonDesc='" + SeasonDesc + '\'' +
'}';
}
}
  • 方式二:JDK5.0之后,使用enum创建枚举类
    • 1.提供当前枚举类的对象,多个对象用“,”隔开,末尾用“;”结束
    • 2.声明Season对象的属性:private、final修饰
    • 3.私有化类的构造器,并对属性进行赋值
    • 4.(可选)获取枚举类的属性,提供toString方法
    • 注意:enum继承的父类并不是Object类,而是java.lang.Enum类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//使用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.获取枚举类的属性,提供toString方法
public String getSeasonName() {
return SeasonName;
}
public String getSeasonDesc() {
return SeasonDesc;
}
}

1.3 Enum类的常用方法

  • 1.values()方法:返回枚举类的对象数组,该方法可以很方便地遍历所有的枚举类
1
2
3
4
5
//values()
Season1[] values = Season1.values();
for (int i = 0; i < values.length; i++) {
System.out.println(values[i]);
}
  • 2.valueOf(String objName):可以把一个字符串转为对应的枚举类对象,要求字符串必须是枚举类对象
1
2
3
//valueOf(String objName)
Season1 winter = Season1.valueOf("WINTER");
System.out.println(winter);
  • 3.toString():返回当前枚举类对象常量的名称

1.4 使用enum关键字定义的枚举类实现接口的情况

  • 1.情况一:实现接口,在enum类中实现抽象方法(普通方法)
  • 2.情况二:让枚举类对象分别实现接口中的抽象方法,在对象后面加上{},在里面重写抽象方法
1
2
3
4
5
6
SPRING("春天", "春暖花开"){
@Override
public void show() {
System.out.println("这是春天!");
}
}

二、注解

2.1 注解(Annotation)理解

  • (1)这是JDK5.0新增的功能
  • (2)Annotation其实是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息
  • (3)在JavaSE中,注解的使用目的比较简单,例如标记过时的功能,忽略警告等。在JavaEE/Android中注解占据了更重要的角色,例如用来配置应用程序的任何切面,代替JavaEE旧版中所遗留的繁冗代码和XML配置等。

2.2 Annotation使用示例

  • 示例一:
    • 生成文档相关的注解
1
2
3
4
5
6
7
8
9
10
11
12
13
@author 标明开发各类莫尅的作者,多个作者使用","来进行分割

@version 标明该类模块的版本

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

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

@param 对方法中参数的说明,如果没有参数就不能写

@return 对方法返回值的说明,如果方法的返回值类型是void就不能写

@exception 对方法可能抛出异常进行说明,如果方法没用throws显示抛出异常就不能写
1
2
3
4
5
6
7
8
9
10
其中:
@param @return 和 @ exception 这三个标记都是只用于方法的

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

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

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

@param@exception 可以并列多个
  • 示例二:
    • 在编译时进行格式检查(JDK内置的三个基本注解)
1
2
3
4
5
@Override:限定重写父类方法,该注解只能用于方法

@Deprecated:用于表示所修饰的元素(类、方法等)一过时。通常是因为所修饰的结构危险或存在更好的选择

@SuppressWarnings:抑制编译器警告

2.3 元注解

  • 理解:
    • JDK提供四种元注解,用来修饰其他Annotation
  • (1)Retention: 指定所修饰的注解的生命周期
    • 格式:@Retention(RetentionPolicy.xxx)
    • 三种状态:
      • SOURCE:通过javac编译后的class文件就不存在次注解
      • CLASS(默认):编译后注解还在,但通过java运行时,该注解不会被加载
      • RUNTIME:运行时注解会被加载
    • 注意:只有声明为RUNTIME生命周期的注解,才能通过反射获取
  • (2)Target: 用于指定被修饰的注解,能用于修饰那些程序元素
    • 格式:@Target({xxx, xxx, xxx,......})
    • 属性:
      • TYPE:表示类、接口、枚举类
      • FIELD:field属性
      • METHOD:方法
      • PARAMETER:属性
      • CONSTRUCTOR:构造器
      • LOCAL_VARIABLE:局部变量
      • ANNOTATION_TYPE:注解类型
      • PACKAGE:包
  • (3)Documented: 被此元注解修饰的注解会被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的
    • 注意:定义为Documented的注解必须设置Retention值为RUNTIME
  • (4)Inherited: 被修饰的注解将具有继承性

2.4 自定义注释(实用度不高)

  • 参照@SuppressWarnings来定义
    • (1)注解声明为@interface
    • (2)内部定义成员,通常用value表示
    • (3)可以指定成员的默认值,使用default定义
    • (4)如果自定义注解没有成员,表明只是个标识
    • 如果注解有成员,在使用注解时,需要指明成员的值
    • 自定义注解必须配上注解的信息流程(使用反射)才有意义
    • 自定义注解一般会指明两个元注解:Retention 和 Target
1
2
3
@interface MyAnnotion{
String value() default "hello";
}