6.9.4 实现接口的枚举类

6.9.4 实现接口的枚举类

枚举类也可以实现一个或多个接口。与普通类实现一个或多个接口完全一样,枚举类实现一个或多个接口时,也需要实现该接口中的所有抽象方法。

1. 在枚举类中实现接口

枚举类实现接口与普通类实现接口完全一样:使用implements实现接口,并实现接口里包含的抽象方法即可。

如果由枚举类来实现接口里的方法,则每个枚举值在调用该方法时都有相同的行为方式(因为方法体完全一样)。

2. 在枚举值中实现接口

如果需要每个枚举值在调用接口方法时呈现出不同的行为方式,则可以让每个枚举值分别来实现该接口方法,,从而让不同的枚举值调用该方法时具有不同的行为方式。

枚举值后面的花括号部分实际上是匿名内部类的类体部分。在这种情况下,当创建枚举值时,并不是直接创建枚举类的实例,而是相当于创建枚举类的匿名子类的实例

实例

目录结构

1
2
3
4
G:\Desktop\随书源码\疯狂Java讲义(第4版)光盘\codes\06\6.9\interface
├─Gender.java
├─GenderDesc.java
└─Test.java

接口

1
2
3
4
public interface GenderDesc
{
void info();
}

实现接口的枚举类

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
34
35
36
37
38
39
public enum Gender implements GenderDesc {
// 调用构造器实例化成员变量
MALE("男")
// 创建当前类的匿名子类
{
// 匿名子类中重写父类Gender的方法
public void info() {
System.out.println("这个枚举值代表男性");
}
},
FEMALE("女")
// 创建当前类的匿名子类
{
// 匿名子类中重写父类Gender的方法
public void info() {
System.out.println("这个枚举值代表女性");
}
},
// 可以不创建匿名子类,则这个枚举默认使用枚举类的info方法
No_MALE_OR_Female("不男不女");

// 定义成员变量
private final String name;

// 枚举类的构造器只能使用private修饰
private Gender(String name) {
this.name = name;
}

public String getName() {
return this.name;
}

// 在枚举中实现接口,这个必须要有
public void info() {
System.out.println("这是一个用于用于定义性别的枚举类");
}
}

测试类:通过枚举实例调用接口方法

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Test {
public static void main(String[] args) {
// 获取三个枚举实例
Gender male = Gender.valueOf("MALE");
Gender female = Gender.valueOf("FEMALE");
Gender no_male_or_female = Gender.valueOf("No_MALE_OR_Female");
// 调用的是枚举值实现的info方法
male.info();
female.info();
// 调用的是枚举类实现的info方法
no_male_or_female.info();
}
}

运行效果:

1
2
3
这个枚举值代表男性
这个枚举值代表女性
这是一个用于用于定义性别的枚举类