在 Java 中,枚举(enum,全称 enumeration)是一种具有固定常量值集合的数据类型。我们使用 enum 关键字来声明枚举。
例如:
enum Size {
SMALL, MEDIUM, LARGE, EXTRALARGE
}
这里,我们创建了一个名为 Size 的枚举,它包含固定的值:SMALL、MEDIUM、LARGE 和 EXTRALARGE。
大括号内的这些值称为枚举常量(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;
这个变量保证只能持有四个合法值之一。如果尝试传入其他值,编译器会报错。