- 对于数量有限的对象,应该优先考虑使用枚举类型
- 好处:类型安全,业务明确
# 定义格式
public enum Weekday {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
public enum Gender {
// 此处的枚举值必须调用对应构造器来创建
MALE("男")
// 花括号部分实际上是一个类体部分
{
// 每个枚举值提供不同的实现方式
public void info()
{
System.out.println("这个枚举值代表男性");
}
},
FEMALE("女")
{
public void info()
{
System.out.println("这个枚举值代表女性");
}
};
private final String name;
// 枚举类的构造器只能使用private修饰
private Gender(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public void info() {
System.out.println("这是一个用于定义性别的枚举类");
}
}
// main...
System.out.println(Gender.MALE); // MALE
System.out.println(Gender.MALE.getName()); // 男
Gender.MALE.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
40
41
42
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
40
41
42
枚举类中的属性字段应该定义为私有的,最好加上 final 修饰符,没有对应的 setter 方法,只能在私有构造函数中赋值
# 特点
- 是一种特殊的类,可以定义构造器、成员变量、普通方法和抽象方法
- 枚举类隐式继承了 java.lang.Enum 类,但不能显式继承其它父类
- 其构造器默认使用
private
修饰,一旦为枚举类显式定义了带参数的构造器,列出枚举值时就必须对应地传入参数 - 枚举类的所有实例必须在枚举类的第一行显式列出;列出这些实例时,系统会默认使用
public
static
final
修饰(全局静态常量);枚举值列举结束后以;
作为结束 - 枚举实例后有花括号时,该枚举实例是枚举类匿名内部子类的对象
# 使用
使用该枚举类的某个实例:EnumClass.variable
Weekday day = Weekday.SATURDAY;
1Enum 类中的实例方法
String name()
、String toString()
:返回该枚举实例的常量名称int ordinal()
:返回该枚举值在枚举类中的索引,从 0 开始boolean equals(Object other)
:当指定对象等于此枚举常量时,返回 true
枚举类默认提供的类方法(从反编译代码中)
// 枚举类型[] values():返回该枚举类所有枚举对象组成的数组 Weekday[] ws = Weekday.values(); // 枚举类型 valueOf(String name):返回名称为 name 的枚举对象 Weekday day = Weekday.valueOf("MONDAY");
1
2
3
4
5switch 也支持操作枚举类型
- switch 的控制表达式可以是枚举类型变量;case 表达式中的值直接使用枚举值的名字,即无须添加枚举类作为限定
- 底层调用枚举对象的 ordinal() 方法,而该方法的返回值类型是 int 类型
使用枚举做单例模式
Sponsor