一、理论说明
1. Enum
(枚举)的定义
在 Java 中,Enum
是一种特殊的数据类型,用于定义一组固定的常量。它是java.lang.Enum
类的子类,每个枚举常量都是该枚举类型的一个实例。Enum
类型提供了类型安全的方式来定义一组相关的常量,例如表示星期几、季节、颜色等。枚举常量在编译时就被确定下来,不能被修改或删除,这保证了数据的一致性和安全性。
2. Enum
与普通类以及常量接口的区别
- 与普通类的区别:
- 定义方式:普通类是使用
class
关键字定义,而Enum
使用enum
关键字定义。 - 实例化:普通类可以通过构造函数多次实例化多个对象,而枚举类型的常量在定义时就已经确定,并且是单例的,不能通过构造函数进行实例化(枚举的构造函数是私有的)。
- 功能特性:枚举类型可以有自己的方法和属性,并且可以实现接口,但不能继承其他类(因为隐式继承了
java.lang.Enum
)。普通类可以继承其他类、实现多个接口,具有更灵活的继承和多态特性。
- 定义方式:普通类是使用
- 与常量接口的区别:
- 类型安全性:常量接口只是定义了一组公共静态常量,在使用时可能会出现类型不匹配的问题,因为它只是简单的常量集合。而枚举类型是一种强类型,每个枚举常量都有其特定的类型,提供了更好的类型安全性。
- 扩展性:常量接口一旦定义,其常量集合就固定了,难以进行扩展。枚举类型可以方便地添加新的枚举常量,并且还可以为枚举常量添加方法和属性,具有更好的扩展性。
- 使用场景:常量接口适用于简单的常量集合,例如数学常量、配置参数等。枚举类型更适合表示有限的、固定的一组值,并且这些值之间可能存在一定的逻辑关系,例如订单状态、权限级别等。
二、常用方法
1. values()
方法
该方法是由编译器自动为枚举类型生成的静态方法,用于返回一个包含该枚举类型所有常量的数组。例如:
enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
public class Main {
public static void main(String[] args) {
Season[] seasons = Season.values();
for (Season season : seasons) {
System.out.println(season);
}
}
}
2. valueOf(String name)
方法
此方法也是编译器自动生成的静态方法,用于根据指定的名称返回对应的枚举常量。如果指定的名称不存在,则会抛出IllegalArgumentException
异常。例如:
enum Color {
RED, GREEN, BLUE
}
public class Main {
public static void main(String[] args) {
try {
Color color = Color.valueOf("RED");
System.out.println(color);
} catch (IllegalArgumentException e) {
System.out.println("不存在该颜色枚举常量");
}
}
}
3. ordinal()
方法
该方法返回枚举常量在枚举类型中的位置(索引),从 0 开始计数。例如:
enum DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public class Main {
public static void main(String[] args) {
DayOfWeek wednesday = DayOfWeek.WEDNESDAY;
int ordinal = wednesday.ordinal();
System.out.println("星期三在枚举中的位置是: " + ordinal);
}
}
4. name()
方法
此方法返回枚举常量的名称,与定义时的名称相同。例如:
enum Fruit {
APPLE, BANANA, ORANGE
}
public class Main {
public static void main(String[] args) {
Fruit apple = Fruit.APPLE;
String name = apple.name();
System.out.println("苹果枚举常量的名称是: " + name);
}
}
三、应用实例
以下代码应用了以上四个方法:
import java.util.Scanner;
enum OrderStatus {
CREATED, PROCESSING, SHIPPED, DELIVERED, CANCELLED
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("所有订单状态:");
OrderStatus[] statuses = OrderStatus.values();
for (OrderStatus status : statuses) {
System.out.println(status);
}
System.out.println("请输入一个订单状态名称:");
String input = scanner.nextLine();
try {
OrderStatus selectedStatus = OrderStatus.valueOf(input);
System.out.println("你输入的订单状态是: " + selectedStatus);
System.out.println("该订单状态在枚举中的位置是: " + selectedStatus.ordinal());
System.out.println("该订单状态的名称是: " + selectedStatus.name());
} catch (IllegalArgumentException e) {
System.out.println("不存在该订单状态");
}
scanner.close();
}
}
代码解释
- 展示所有枚举常量:通过
OrderStatus.values()
方法获取OrderStatus
枚举类型的所有常量,并遍历输出。 - 获取指定枚举常量:提示用户输入一个订单状态名称,使用
OrderStatus.valueOf(input)
方法尝试获取对应的枚举常量。如果输入的名称有效,则进一步展示该枚举常量的位置(通过ordinal()
方法)和名称(通过name()
方法);如果输入的名称无效,则捕获异常并提示用户不存在该订单状态。
四、面试题
题目:
答案:
自我总结
通过对Enum
(枚举)的学习,我们了解到它在定义固定常量集合时的重要性和优势。与普通类和常量接口相比,Enum
在定义方式、实例化、类型安全性、扩展性和使用场景等方面都有明显的差异。掌握values()
、valueOf(String name)
、ordinal()
、name()
等常用方法,能够让我们在实际编程中根据不同需求灵活运用枚举类型。在实际应用场景中,如表示状态、类型分类、选项集合等,Enum
都能发挥其独特优势,提高代码的可读性、类型安全性和可维护性。同时,合理使用枚举类型的方法和特性,可以更好地组织和管理代码中的常量数据。