Java 枚举(enum)是一种特殊的类,用于表示一组固定的常量。enum 在 Java 中是一个引用数据类型,可以用于表示一组预定义的常量,例如一周的七天、季节、状态码等。
Java 枚举是 java.lang.Enum 类的一个子类,具备了很多特殊功能,允许你定义有限个数的常量,并提供了强大的功能,如 switch 判断、遍历、与其他对象比较等。
1. 枚举的基本语法
枚举的声明使用 enum 关键字,枚举的每个常量通常以大写字母表示。
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
2. 使用枚举
一旦定义了枚举类型,就可以通过枚举常量来引用它们。
public class EnumExample {
public static void main(String[] args) {
Day today = Day.MONDAY;
switch (today) {
case MONDAY:
System.out.println("Start of the workweek");
break;
case FRIDAY:
System.out.println("Almost the weekend");
break;
case SUNDAY:
System.out.println("Weekend is over");
break;
default:
System.out.println("Midweek days");
}
}
}
输出:
Start of the workweek
3. 枚举的字段、构造方法和方法
枚举不仅仅是一些常量,它可以有字段、构造方法和方法。每个枚举常量都可以与数据和行为关联。
3.1 枚举的字段和构造方法
可以为枚举定义字段(例如,存储枚举常量相关的值)和构造方法。构造方法在枚举常量创建时会调用。
enum Day {
MONDAY("Work day"), TUESDAY("Work day"), WEDNESDAY("Work day"),
THURSDAY("Work day"), FRIDAY("Work day"), SATURDAY("Weekend"),
SUNDAY("Weekend");
private String type;
// 构造方法
Day(String type) {
this.type = type;
}
// 方法
public String getType() {
return this.type;
}
}
public class EnumExample {
public static void main(String[] args) {
Day today = Day.MONDAY;
System.out.println(today + ": " + today.getType()); // 输出 "MONDAY: Work day"
}
}
输出:
MONDAY: Work day
3.2 枚举的方法
你可以在枚举中定义方法来处理与常量相关的逻辑。比如:
enum Day {
MONDAY("Work day", 1), TUESDAY("Work day", 2), WEDNESDAY("Work day", 3),
THURSDAY("Work day", 4), FRIDAY("Work day", 5), SATURDAY("Weekend", 6),
SUNDAY("Weekend", 7);
private String type;
private int dayNumber;
Day(String type, int dayNumber) {
this.type = type;
this.dayNumber = dayNumber;
}
public String getType() {
return this.type;
}
public int getDayNumber() {
return this.dayNumber;
}
}
public class EnumExample {
public static void main(String[] args) {
for (Day day : Day.values()) {
System.out.println(day + ": " + day.getType() + ", Day number: " + day.getDayNumber());
}
}
}
输出:
MONDAY: Work day, Day number: 1
TUESDAY: Work day, Day number: 2
WEDNESDAY: Work day, Day number: 3
THURSDAY: Work day, Day number: 4
FRIDAY: Work day, Day number: 5
SATURDAY: Weekend, Day number: 6
SUNDAY: Weekend, Day number: 7
4. 枚举的内置方法
枚举类默认继承 java.lang.Enum 类,因此它有一些内置的方法。常用的内置方法包括:
4.1 values()
返回一个包含所有枚举常量的数组,按它们在枚举定义中的声明顺序返回。
public class EnumExample {
public static void main(String[] args) {
// 获取所有枚举常量
Day[] days = Day.values();
for (Day day : days) {
System.out.println(day);
}
}
}
输出:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY
4.2 valueOf(String name)
将一个字符串与枚举常量的名称进行匹配,并返回对应的枚举常量。
public class EnumExample {
public static void main(String[] args) {
Day day = Day.valueOf("MONDAY");
System.out.println("The selected day is: " + day);
}
}
输出:
The selected day is: MONDAY
如果传入的字符串不在枚举常量中,会抛出 IllegalArgumentException。
4.3 ordinal()
返回枚举常量的序号(从 0 开始)。
public class EnumExample {
public static void main(String[] args) {
Day day = Day.MONDAY;
System.out.println(day + " ordinal is: " + day.ordinal());
}
}
输出:
MONDAY ordinal is: 0
4.4 compareTo()
与 ordinal() 类似,compareTo() 方法比较当前枚举常量和指定枚举常量的位置,返回一个整数值,表示它们在枚举中位置的相对顺序。
public class EnumExample {
public static void main(String[] args) {
Day day1 = Day.MONDAY;
Day day2 = Day.FRIDAY;
System.out.println(day1.compareTo(day2)); // 输出 -4,因为 MONDAY 在 FRIDAY 前
}
}
5. 枚举的实际应用
5.1 枚举与 switch 语句
由于枚举值是常量,因此可以直接用于 switch 语句中,这样可以让代码更加清晰和安全。
public class EnumExample {
public static void main(String[] args) {
Day today = Day.WEDNESDAY;
switch (today) {
case MONDAY:
System.out.println("Start of the work week");
break;
case FRIDAY:
System.out.println("Almost the weekend");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Weekend!");
break;
default:
System.out.println("Midweek day");
}
}
}
5.2 枚举用于状态机模式
可以使用枚举来定义状态机的不同状态,并结合方法来改变状态的行为。
enum OrderStatus {
NEW {
@Override
public void handle() {
System.out.println("Order is new. Handle it.");
}
},
SHIPPED {
@Override
public void handle() {
System.out.println("Order is shipped. Handle shipping.");
}
},
DELIVERED {
@Override
public void handle() {
System.out.println("Order is delivered. Finalize the order.");
}
};
public abstract void handle(); // 抽象方法
}
public class EnumExample {
public static void main(String[] args) {
OrderStatus status = OrderStatus.NEW;
status.handle(); // 输出 "Order is new. Handle it."
}
}
6. 总结
- 定义枚举:通过
enum关键字,定义一组有限的常量。 - 枚举常量:可以包含字段、构造方法、方法和枚举常量。
- 内置方法:
values(),valueOf(),ordinal(),compareTo()等方法使得枚举更具功能。 - 应用场景:常用于表示有限的状态集合、策略模式、事件处理、状态机等。
通过枚举,可以使代码更加清晰、类型安全,并有效避免硬编码。你可以将枚举应用到很多场景中,尤其是那些需要定义固定常量的地方。更多详细内容请关注其他相关文章!