枚举和注解
第十一章 枚举和注解
枚举
枚举对应英文 enumeration,是一组常量的集合。
枚举属于一种特殊的类,里面只包含一组有限的特定的对象。
自定义类实现枚举
- 构造器私有化,防止被直接 new 创建对象;
- 不需要提供
setXxx
方法,因为枚举对象值通常为只读; - 对枚举对象/属性使用
final
、static
共同修饰,可以直接引用,而且不能被修改; - 枚举对象名通常使用全部大写,即为常量的命名规范;
- 枚举对象根据需要,可以有多个属性。
1 | package com.f.Chapter11; |
使用enum关键字实现枚举
- 当我们使用 enum 关键字创建一个枚举类时,默认会继承 Enum 类,而且创建的这个枚举类是一个
final
类; - 先前的
public static final Season SPRING = new Season("春天");
简化为SPRING("春天")
,这里必须知道,它调用的是哪个构造器; - 如果使用无参构造器创建枚举对象,则实参列表和小括号都可以省略;
- 如果有多个常量对象,使用 ”,“ 间隔即可,最后用 ”;“ 结尾;
- 如果使用 enum 实现枚举,则要把定义的常量对象写在最前面。
1 | package com.f.Chapter11; |
enum常用方法
使用关键字 enum 时,会隐式继承 Enum 类,这样我们就可以使用 Enum 类相关的方法。
toString
:Enum类已经重写过了,返回的是当前对象名,子类可以重写该方法,用于返回对象的属性信息;name
:得到当前枚举常量的名称。建议优先使用toString;ordinal
:输出该枚举对象的次序/编号,从0开始编号;values
:返回该枚举类的枚举对象数组;valueOf
:将字符串转换成枚举对象,要求字符串必须为已有的常量名,否则报异常;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
33package 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使用细节
使用 enum 关键字后,就不能再继承其它类了,因为 enum 会隐式继承 Enum,而 Java 是单继承机制;
枚举和普通类一样,可以实现接口:
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
26package 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;
}
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:子类会继承父类注解。