ZetCode

Java 枚举类型

上次修改时间:2024 年 3 月 6 日

在本文中,我们将展示如何在 Java 中使用枚举类型。

枚举类型 是 Java 内置的数据类型,它定义了一组固定的命名常量。常量集之后不能更改。具有枚举类型的变量可以被赋值为任何枚举器作为值。

与使用像整数这样的原始数据类型相比,枚举类型提供了一种更健壮和可读的方式来处理常量值。枚举通过保证变量只能保存预定义的值之一来强制执行类型安全。

任何时候我们需要表示一组固定的常量时,我们都应该使用枚举类型。有许多自然的枚举类型,例如我们太阳系中的行星、季节或星期几。这些是我们在编译时就知道所有可能值的数据集。

public enum Size {
    SMALL, MEDIUM, LARGE
}

我们使用 enum 关键字来定义 Java 中的枚举。用大写字母命名常量是一种良好的编程实践。

简单示例

我们有一个包含枚举的简单代码示例。

Main.java
enum Day {

    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

void main() {

    Day day = Day.MONDAY;

    if (day == Day.MONDAY) {

        System.out.println("It is Monday");
    }

    System.out.println(day);

    for (Day d : Day.values()) {

        System.out.println(d);
    }
}

我们定义了 Day 枚举,它表示一组固定的七个日期名称。

enum Day {

    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

枚举类型是使用 enum 关键字创建的。按照惯例,常量用大写字母书写。

Day day = Day.MONDAY;

我们有一个名为 day 的变量,它的枚举类型为 Day。它被初始化为 Day.Monday

for (Day d : Day.values()) {

    System.out.println(d);
}

此循环将所有日期打印到控制台。values 方法返回一个数组,其中包含此枚举类型的常量,按声明的顺序排列。此方法可用于使用增强型 for 语句迭代常量。增强型 for 遍历数组,逐个元素,并将它们打印到终端。

$ java Main.java
It is Monday
MONDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

为枚举常量提供值

我们可以显式地为枚举常量提供一些值。

Main.java
enum Season {

    SPRING(10),
    SUMMER(20),
    AUTUMN(30),
    WINTER(40);

    private int value;

    private Season(int value) {
        this.value = value;
    }

    public int getValue() {

        return value;
    }
}

void main() {

    for (Season season : Season.values()) {

        System.out.println(STR."\{season} \{season.getValue()}");
    }
}

该示例包含一个具有四个常量的 Season 枚举。

SPRING(10),
SUMMER(20),
AUTUMN(30),
WINTER(40);

这里我们定义了枚举的四个常量。常量被赋予特定的值。

$ java Main.java
SPRING 10
SUMMER 20
AUTUMN 30
WINTER 40

掷硬币

枚举是一种类类型。我们可以定义自己的方法。

Main.java
import java.util.Random;

public enum Coin {
    HEADS,
    TAILS;

    public static Coin toss() {

        var rand = new Random();
        int rdx = rand.nextInt(Coin.values().length);
        return Coin.values()[rdx];
    }
}

void main() {

    for (int i = 1; i <= 15; i++) {

        System.out.print(STR."\{Coin.toss()} ");
    }
}

该示例定义了 toss 方法,该方法随机选择一个常量:HEADSTAILS。稍后在 for 循环中,我们调用 toss 十五次。

$ java Main.java
HEADS TAILS HEADS TAILS HEADS HEADS TAILS HEADS HEADS HEADS TAILS TAILS HEADS TAILS TAILS 

带有 switch 表达式的枚举类型

枚举可以有效地与 switch 表达式一起使用。

Main.java
import java.util.Random;

void main() {

    Season season = Season.randomSeason();

    String msg = switch (season) {

        case Season.SPRING -> "Spring";
        case Season.SUMMER -> "Summer";
        case Season.AUTUMN -> "Autumn";
        case Season.WINTER -> "Winter";
    };

    System.out.println(msg);
}

enum Season {
    SPRING,
    SUMMER,
    AUTUMN,
    WINTER;

    public static Season randomSeason() {
        
        var random = new Random();
        int ridx = random.nextInt(Season.values().length);
        return Season.values()[ridx];
    }
}

我们定义一个 Season 枚举。枚举包含一个 randomSeason 方法,该方法随机创建一个 Season 值。根据选择的值,我们打印一条消息。

var msg = switch (season) {

    case Season.Spring -> "Spring";
    case Season.Summer -> "Summer";
    case Season.Autumn -> "Autumn";
    case Season.Winter -> "Winter";
};

System.out.println(msg);

我们根据 switch 表达式检查该值。该表达式返回枚举的字符串表示形式。由于编译器预先知道所有可能的常量,因此 switch 表达式是详尽的,也就是说,我们不必定义 default 分支。

来源

枚举类型 - 语言参考

在本文中,我们使用了 Java 中的枚举。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有Java教程