枚举和枚举方法
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 50 课,共 87 课。
enum(枚举)是一种特殊的类类型,用于表示一组固定的常量。与使用任意整数或字符串表示星期几、订单状态等选项不同,枚举提供了类型安全且易读的值。
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // 输出:MONDAY枚举不只是简单的常量:它们是完整的类。你可以为它们添加字段、构造函数和方法:
enum Size {
SMALL(10), MEDIUM(20), LARGE(30);
private int price;
Size(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
System.out.println(Size.MEDIUM.getPrice()); // 输出:20每个枚举都有一些实用的内置方法。values() 方法会返回包含所有常量的数组,而 valueOf() 会将字符串转换为匹配的枚举常量。ordinal() 方法会返回常量的位置(从 0 开始):
for (Day d : Day.values()) {
System.out.println(d + " is at position " + d.ordinal());
}
Day day = Day.valueOf("FRIDAY"); // 将字符串转换为枚举值当你有一组已知且固定、运行时不会改变的值时,枚举是理想的选择。与使用普通常量相比,使用枚举能让代码更安全,也更具表达力。
挑战
简单让我们来构建一个咖啡店点单系统,展示带有字段、构造函数和方法的枚举有多强大。你将创建一个 CoffeeSize 枚举来保存价格信息,并构建一个处理顾客订单的系统。
你需要将代码放在三个文件中:
CoffeeSize.java:创建一个表示咖啡杯型并关联价格的枚举。你的枚举应包含三个常量:SMALL、MEDIUM和LARGE,对应的价格分别为2.50、3.50和4.50。每种杯型都需要一个私有的
price字段(double)、一个用于设置该字段的构造函数,以及一个用于获取价格的getPrice()方法。还要添加一个getDescription()方法,返回以下格式的字符串:[size name] - $[price](例如:SMALL - $2.5)Order.java:创建一个表示咖啡订单的类。Order 有两个私有字段:customerName(String)和size(CoffeeSize)。添加一个用于初始化这两个字段的构造函数,以及对应的 getter 方法。添加一个
getReceipt()方法,返回多行字符串:Order for: [customerName] Size: [size description from getDescription()] Total: $[price from the size]Main.java:让你的咖啡店运作起来!你将接收两个输入:顾客姓名(String)和杯型名称(String,例如 "SMALL"、"MEDIUM" 或 "LARGE")。首先,使用
CoffeeSize.valueOf()将杯型字符串转换为对应的枚举常量。使用顾客姓名和杯型创建一个 Order,然后打印收据。打印收据后,打印一个空行,然后使用
values()方法遍历所有CoffeeSize值,显示完整菜单。对每种杯型,单独一行打印它的描述。
你将依次收到两个输入:顾客姓名和杯型名称("SMALL"、"MEDIUM" 或 "LARGE" 之一)。
注意,枚举同时封装了杯型标识及其对应的价格,这比在代码中使用单独的常量或魔法数字清晰得多!
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入
String customerName = scanner.nextLine();
String sizeName = scanner.nextLine();
// TODO:使用 valueOf() 将 sizeName 转换为 CoffeeSize 枚举值
// TODO:用顾客姓名和尺寸创建一个 Order 对象
// TODO:打印收据
// TODO:打印一个空行
// TODO:遍历所有 CoffeeSize 值,显示完整菜单
// 提示:使用 CoffeeSize.values() 获取所有枚举常量
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器