Java 基础 - 枚举类
# 什么是枚举类
如果一个类的对象是有限且确定的,那么这个类就是枚举类。比如性别(男女)、季节(春夏秋冬)、星期(星期一 ~ 星期日)等。
在开发过程中,建议使用枚举类代替常量。
# 枚举类的创建方式
在 JDK1.5 之前需要自定义枚举类,JDK1.5 之后可以使用enum
关键字定义枚举类。
# 不使用 enum 关键字
class Season{
private final String NAME;
private final String DESC;
private Season(String name, String desc){
this.NAME = name;
this.DESC = desc;
}
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
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用 enum 关键字
enum SeasonEnum{
SPRING("春天", "春风又绿江南岸"),
SUMMER("夏天", "映日荷花别样红"),
AUTUMN("秋天", "秋水共长天一色"),
WINTER("冬天", "窗含西岭千秋雪");
public final String name;
public final String desc;
SeasonEnum(String name, String desc){
this.name = name;
this.desc = desc;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
使用枚举类需要注意以下几点
- 由于枚举类的对象是固定的,不可能构造出新的对象,所以比较两个枚举类型的对象时,直接使用 "==" 即可。
- 由于枚举类的对象是固定的,不能在类的外部创建新对象,所以枚举类的构造器必须是私有的。
- 若枚举类定义了带参数的构造器,那么在列出枚举值的时候也要传入相应的参数。
- 所有枚举类型都是
java.lang.Enum
类的子类。
# 枚举类的主要方法
由于所有使用了enum
关键字的枚举类都默认继承了java.lang.Enum
,所以也会拥有父类的方法。Enum 类中的一些方法:
- toString():会返回枚举常量名,toString 的逆方法是静态方法 valueOf()。
- valueOf():传递枚举常量名给 valueOf(),会返回与之匹配的枚举对象。
- values():返回一个包含所有枚举值的数组。
- ordinal():返回枚举类中常量的位置,下标从 0 开始。
- compareTo(E other) 如果枚举常量出现在 other 之前,返回一个负整数;如果 this==other,则返回 0;否则返回一个正整数。
public class EnumTest {
public static void main(String[] args) {
SeasonEnum spring = SeasonEnum.SPRING;
String s = spring.toString();
System.out.println(s);
System.out.println("--------");
SeasonEnum valueOfSpring = SeasonEnum.valueOf(s);
System.out.println(spring == valueOfSpring);
System.out.println("--------");
SeasonEnum[] values = SeasonEnum.values();
System.out.println(Arrays.toString(values));
System.out.println("--------");
System.out.println(SeasonEnum.SUMMER.ordinal());
System.out.println("--------");
System.out.println(SeasonEnum.SUMMER.compareTo(SeasonEnum.WINTER));
}
}
enum SeasonEnum{
SPRING("春天", "春风又绿江南岸"),
SUMMER("夏天", "映日荷花别样红"),
AUTUMN("秋天", "秋水共长天一色"),
WINTER("冬天", "窗含西岭千秋雪");
public final String name;
public final String desc;
SeasonEnum(String name, String desc){
this.name = name;
this.desc = desc;
}
}
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
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
输出:
SPRING
--------
true
--------
[SPRING, SUMMER, AUTUMN, WINTER]
--------
1
--------
-2
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
上次更新: 2023/11/01, 03:11:44