0%

枚举和注解

枚举和注解

第十一章 枚举和注解

枚举

  • 枚举对应英文 enumeration,是一组常量的集合。

    枚举属于一种特殊的类,里面只包含一组有限的特定的对象。

自定义类实现枚举
  1. 构造器私有化,防止被直接 new 创建对象;
  2. 不需要提供 setXxx 方法,因为枚举对象值通常为只读;
  3. 对枚举对象/属性使用 finalstatic 共同修饰,可以直接引用,而且不能被修改;
  4. 枚举对象名通常使用全部大写,即为常量的命名规范;
  5. 枚举对象根据需要,可以有多个属性。
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
package com.f.Chapter11;

public class Enumeration01 {
public static void main(String[] args) {
System.out.println(Season.SPRING.getName());
}
}

class Season {
private String name;

//3.在自定义类的内部创建固定的对象,且为public
//4.使用 `final`、`static` 共同修饰,可以直接引用,而且不能被修改
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("冬天");

//1.构造器私有化,防止被直接 new 创建对象
private Season(String name) {
this.name = name;
}

public String getName() {
return name;
}

//2.去除 setXxx 相关方法,防止属性被修改
//public void setName(String name) {
// this.name = name;
//}
}
使用enum关键字实现枚举
  1. 当我们使用 enum 关键字创建一个枚举类时,默认会继承 Enum 类,而且创建的这个枚举类是一个 final 类;
  2. 先前的 public static final Season SPRING = new Season("春天"); 简化为 SPRING("春天"),这里必须知道,它调用的是哪个构造器;
  3. 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略;
  4. 如果有多个常量对象,使用 ”,“ 间隔即可,最后用 ”;“ 结尾
  5. 如果使用 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
package com.f.Chapter11;

public class Enumeration02 {
public static void main(String[] args) {
System.out.println(Season.SPRING.getName());
}
}

enum Season {
//1.使用关键字 enum 替代 class
//2.public static final Season SPRING = new Season("春天");
// 直接使用SPRING("春天")替代 --> 常量名(实参列表)
//3.如果有多个常量对象,使用 ”,“ 间隔即可
//4.如果使用 enum 实现枚举,则要把定义的常量对象写在最前面
SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
private String name;

private Season(String name) {
this.name = name;
}

public String getName() {
return name;
}
}
enum常用方法
  • 使用关键字 enum 时,会隐式继承 Enum 类,这样我们就可以使用 Enum 类相关的方法。

    1. toString:Enum类已经重写过了,返回的是当前对象名,子类可以重写该方法,用于返回对象的属性信息;
    2. name:得到当前枚举常量的名称。建议优先使用toString;
    3. ordinal:输出该枚举对象的次序/编号,从0开始编号;
    4. values:返回该枚举类的枚举对象数组;
    5. valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常;
    6. compareTo:比较两个枚举常量的编号,输出结果为:”前者的编号 - 后者的编号“。
    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
    33
    package com.f.Chapter11.enum_;

    public class EnumMethod {
    public static void main(String[] args) {
    Season autumn = Season.AUTUMN;
    //1.toString:Enum类已经重写过了,返回的是当前对象名,子类可以重写该方法,用于返回对象的属性信息
    System.out.println(autumn.toString()); //AUTUMN
    //2.name:得到当前枚举常量的名称。建议优先使用toString
    System.out.println(autumn.name()); //AUTUMN
    //3.ordinal:输出该枚举对象的次序/编号,从0开始编号
    System.out.println(autumn.ordinal()); //2
    //4.values:返回枚举类的枚举对象数组,如这里为Season[]
    for (Season season : Season.values())
    System.out.print(season + " "); //SPRING SUMMER AUTUMN WINTER
    System.out.println();
    //5.valueOf:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常
    Season autumn2 = Season.valueOf("AUTUMN");
    System.out.println(autumn == autumn2); //true
    //6.compareTo:比较两个枚举常量的编号,输出结果为:前者的编号 - 后者的编号
    System.out.println(Season.SUMMER.compareTo(Season.SUMMER)); //0
    System.out.println(Season.SUMMER.compareTo(Season.SPRING)); //1
    System.out.println(Season.SUMMER.compareTo(Season.WINTER)); //-2
    }
    }

    enum Season {
    SPRING("春天"), SUMMER("夏天"), AUTUMN("秋天"), WINTER("冬天");
    private String name;

    private Season(String name) {
    this.name = name;
    }
    }
enum使用细节
  1. 使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制;

  2. 枚举和普通类一样,可以实现接口:enum 类名 implements 接口1, 接口2{}

    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
    package com.f.Chapter11.enum_;

    public class EnumDetail {
    public static void main(String[] args) {
    IPlayingMusic iPlayingMusic = Music.CLASSIC;
    iPlayingMusic.playingMusic();
    }
    }

    enum Music implements IPlayingMusic {
    CLASSIC("古典");
    private String name;

    Music(String name) {
    this.name = name;
    }

    @Override
    public void playingMusic() {
    System.out.println("正在播放" + this.name + "音乐...");
    }
    }

    interface IPlayingMusic {
    void playingMusic();
    }

注解

  • 注解(Annotation)也被称为元数据(MetaData),用于修饰解释包、类、方法、属性、构造器、局部变量等数据信息。

    和注释一样,注解不影响程序逻辑,但注解可以被编译或运行,相当于嵌入在代码中的补充信息

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

Override注解
  • @Override:限定某个方法,是重写了父类方法,该注解只能用于方法。
  • 如果你在某个方法上写了 @Override 注解,编译器就会去检查该方法是否真的重写了父类的方法,如果的确重写了,则编译通过,如果没有构成重写,则编译错误。
Deprecated注解
  • @Deprecated:用于表示某个程序元素(类、方法、属性等)已经过时。

    注意:过时表示不再推荐使用,但不表示不能用

SuppressWarnings注解
  • @SuppressWarnings:当我们不希望看到警告信息时,就可以使用 @SuppressWarnings 注解来抑制警告信息。

    {""} 中,写入你希望抑制(不显示)的警告信息。

  • SuppressWarnings 的作用范围和你放置的位置相关,比如 @SuppressWarnings 放置在 main 方法,那么抑制警告的范围就是 main

四种元注解

  • Retention:指定注解的作用范围。

  • Target:指定注解可以在哪些地方使用,即可以修饰哪些程序元素。

  • Documented:指定该注解是否会在 javadoc 体现。

  • Inherited:子类会继承父类注解。

---------------The End---------------