Menu
CoddyTech

枚举和枚举方法

本课属于 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");  // 将字符串转换为枚举值

当你有一组已知且固定、运行时不会改变的值时,枚举是理想的选择。与使用普通常量相比,使用枚举能让代码更安全,也更具表达力。

challenge icon

挑战

简单

让我们来构建一个咖啡店点单系统,展示带有字段、构造函数和方法的枚举有多强大。你将创建一个 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() 获取所有枚举常量
        
    }
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Java 在线编译器