Java 枚举(enum)与枚举类(附示例)

更新于 2025-12-27

在 Java 中,枚举(enum,全称 enumeration)是一种具有固定常量值集合的数据类型。我们使用 enum 关键字来声明枚举。

例如:

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
}

这里,我们创建了一个名为 Size 的枚举,它包含固定的值:SMALLMEDIUMLARGEEXTRALARGE
大括号内的这些值称为枚举常量(enum constants)。

注意:枚举常量通常用大写字母表示。


示例 1:Java 枚举

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Main {
    public static void main(String[] args) {
        System.out.println(Size.SMALL);
        System.out.println(Size.MEDIUM);
    }
}

输出

SMALL
MEDIUM

从上面的例子可以看出,我们通过枚举名称来访问其常量值。

此外,我们还可以声明枚举类型的变量。例如:

Size pizzaSize;

这里,pizzaSize 是一个 Size 类型的变量,它只能被赋予以下四个值之一:

pizzaSize = Size.SMALL;
pizzaSize = Size.MEDIUM;
pizzaSize = Size.LARGE;
pizzaSize = Size.EXTRALARGE;

示例 2:Java 枚举与 switch 语句

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Test {
    Size pizzaSize;

    public Test(Size pizzaSize) {
        this.pizzaSize = pizzaSize;
    }

    public void orderPizza() {
        switch(pizzaSize) {
            case SMALL:
                System.out.println("我点了一个小号披萨。");
                break;
            case MEDIUM:
                System.out.println("我点了一个中号披萨。");
                break;
            default:
                System.out.println("我不知道该点哪个尺寸。");
                break;
        }
    }
}

class Main {
    public static void main(String[] args) {
        Test t1 = new Test(Size.MEDIUM);
        t1.orderPizza();
    }
}

输出

我点了一个中号披萨。

在上面的程序中,我们定义了一个 Size 枚举类型,并声明了一个 Size 类型的变量 pizzaSize
该变量只能被赋值为四个枚举常量之一。

注意这行代码:

Test t1 = new Test(Size.MEDIUM);

它会调用 Test 类中的构造函数,将 pizzaSize 赋值为 MEDIUM 常量。
然后根据该值,执行 switch 语句中的对应分支。


Java 中的枚举类(Enum Class)

在 Java 中,枚举类型被视为一种特殊的类。它是在 Java 5 中引入的。

枚举类可以像普通类一样包含方法和字段:

enum Size {
    constant1, constant2, ..., constantN;
    
    // 方法和字段
}

当我们创建一个枚举类时,编译器会自动为每个枚举常量创建实例(对象)。
此外,所有枚举常量默认都是 public static final 的。


示例 3:Java 枚举类

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE;

    public String getSize() {
        // this 指向当前枚举常量对象(如 SMALL)
        switch(this) {
            case SMALL:
                return "small";
            case MEDIUM:
                return "medium";
            case LARGE:
                return "large";
            case EXTRALARGE:
                return "extra large";
            default:
                return null;
        }
    }

    public static void main(String[] args) {
        // 使用 SMALL 对象调用 getSize()
        System.out.println("披萨的尺寸是 " + Size.SMALL.getSize());
    }
}

输出

披萨的尺寸是 small

在这个例子中,我们创建了一个名为 Size 的枚举类,包含四个常量。
由于 Size 是一个枚举类,编译器会自动为每个常量创建实例。

main() 方法中,我们使用 SMALL 实例调用了 getSize() 方法。

注意:和普通类一样,枚举类也可以包含构造函数。更多内容请参阅 Java 枚举构造函数


Java 枚举类的内置方法

枚举类提供了一些预定义的方法,可直接使用:

1. ordinal() 方法

返回枚举常量的位置(从 0 开始)。

Size.SMALL.ordinal()  // 返回 0

2. compareTo() 方法

根据枚举常量的序数(ordinal)进行比较。

Size.SMALL.compareTo(Size.MEDIUM)  // 返回 0 - 1 = -1

3. toString() 方法

返回枚举常量的字符串表示形式。

Size.SMALL.toString()  // 返回 "SMALL"

4. name() 方法

返回枚举常量的定义名称(字符串形式),该值是 final 的。

Size.SMALL.name()  // 返回 "SMALL"

5. valueOf() 方法

接收一个字符串,返回名称匹配的枚举常量。

Size.valueOf("SMALL")  // 返回常量 SMALL

6. values() 方法

返回一个包含所有枚举常量的数组。

Size[] enumArray = Size.values();

为什么使用 Java 枚举?

Java 引入枚举是为了替代传统的整型常量。

假设我们使用一组 int 常量:

class Size {
    public static final int SMALL = 1;
    public static final int MEDIUM = 2;
    public static final int LARGE = 3;
    public static final int EXTRALARGE = 4;
}

问题在于:当我们打印这些常量时,只会输出数字(如 2),这不够直观,也不便于调试。

而使用枚举则清晰得多:

enum Size {
    SMALL, MEDIUM, LARGE, EXTRALARGE
}

这样代码更具可读性和表达力。

此外,枚举提供了编译时类型安全

Size size;

这个变量保证只能持有四个合法值之一。如果尝试传入其他值,编译器会报错。