在 Java 中,枚举类(enum)是一种非常强大且灵活的特性,它不仅可以用来定义一组固定的常量,还可以结合面向对象的特性实现更复杂的功能。以下是枚举类的常见用法及其详细说明:
1. 定义一组常量
这是枚举最基本、最常见的用法,用于表示一组固定的、预定义的值。
enum Color {
RED, GREEN, BLUE
}
public class TestEnum {
public static void main(String[] args) {
Color c = Color.RED;
System.out.println(c); // 输出: RED
}
}
-
用途:替代传统的
public static final常量(如public static final int RED = 1;),更类型安全。 -
优点:避免魔法数字(magic numbers),提高代码可读性和维护性。
2. 带属性和方法的枚举
枚举常量可以拥有属性和方法,从而让每个常量携带额外的信息或行为。
enum Day {
MONDAY("星期一", 1),
TUESDAY("星期二", 2),
SUNDAY("星期日", 7);
private final String description;
private final int dayOfWeek;
Day(String description, int dayOfWeek) {
this.description = description;
this.dayOfWeek = dayOfWeek;
}
public String getDescription() {
return description;
}
public int getDayOfWeek() {
return dayOfWeek;
}
}
public class TestEnum {
public static void main(String[] args) {
Day day = Day.MONDAY;
System.out.println(day.getDescription()); // 输出: 星期一
System.out.println(day.getDayOfWeek()); // 输出: 1
}
}
-
用途:为每个枚举常量关联额外的数据或逻辑。
-
优点:使枚举更具表现力,适用于需要描述性信息的场景。
3. 实现接口
枚举类可以实现接口,从而让枚举常量具备接口定义的行为。
interface Printable {
void print();
}
enum Color implements Printable {
RED {
public void print() {
System.out.println("Red color");
}
},
GREEN {
public void print() {
System.out.println("Green color");
}
},
BLUE {
public void print() {
System.out.println("Blue color");
}
};
}
public class TestEnum {
public static void main(String[] args) {
Color.RED.print(); // 输出: Red color
Color.GREEN.print(); // 输出: Green color
}
}
-
用途:为每个枚举常量定义特定的行为。
-
优点:结合多态性,使代码更灵活。
4. 在 switch 语句中使用
枚举非常适合与 switch 语句结合使用,因为它是类型安全的。
enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
public class TestEnum {
public static void main(String[] args) {
Season season = Season.SUMMER;
switch (season) {
case SPRING:
System.out.println("It's spring!");
break;
case SUMMER:
System.out.println("It's summer!");
break;
case AUTUMN:
System.out.println("It's autumn!");
break;
case WINTER:
System.out.println("It's winter!");
break;
}
}
}
-
输出:
It's summer! -
用途:在条件分支中清晰地处理枚举值。
-
优点:编译器会检查所有枚举值是否都被覆盖(如果没有
default分支),减少遗漏错误。
5. 单例模式
枚举可以用来实现线程安全的单例模式,这是 Java 中最简洁的单例实现方式之一。
enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("Singleton is working!");
}
}
public class TestEnum {
public static void main(String[] args) {
Singleton.INSTANCE.doSomething(); // 输出: Singleton is working!
}
}
-
用途:替代传统的单例类实现。
-
优点:天生线程安全,避免序列化问题,代码简洁。
6. 枚举集合:EnumSet 和 EnumMap
Java 提供了专门的集合类来处理枚举:EnumSet 和 EnumMap。
-
EnumSet:高效的枚举集合。
import java.util.EnumSet; enum Color { RED, GREEN, BLUE } public class TestEnum { public static void main(String[] args) { EnumSet<Color> colors = EnumSet.of(Color.RED, Color.BLUE); System.out.println(colors); // 输出: [RED, BLUE] } }-
用途:表示一组枚举值的集合。
-
优点:性能极高,基于位运算实现。
-
-
EnumMap:以枚举作为键的映射。
import java.util.EnumMap; enum Day { MONDAY, TUESDAY, WEDNESDAY } public class TestEnum { public static void main(String[] args) { EnumMap<Day, String> map = new EnumMap<>(Day.class); map.put(Day.MONDAY, "Work"); map.put(Day.TUESDAY, "Study"); System.out.println(map); // 输出: {MONDAY=Work, TUESDAY=Study} } }-
用途:将枚举值映射到其他数据。
-
优点:高效且类型安全。
-
7. 值获取和遍历
枚举类提供了一些内置方法,方便获取和遍历所有枚举常量。
enum Color {
RED, GREEN, BLUE
}
public class TestEnum {
public static void main(String[] args) {
// 获取所有枚举值
for (Color c : Color.values()) {
System.out.println(c + " ordinal: " + c.ordinal());
}
// 根据名称获取枚举值
Color c = Color.valueOf("RED");
System.out.println("Value of RED: " + c);
}
}
-
输出:
RED ordinal: 0 GREEN ordinal: 1 BLUE ordinal: 2 Value of RED: RED
-
常用方法:
-
values():返回所有枚举常量的数组。 -
valueOf(String name):根据名称返回对应的枚举常量。 -
ordinal():返回枚举常量的声明顺序(从 0 开始)。
-
-
用途:遍历枚举值或根据字符串动态获取枚举实例。
8. 抽象方法
枚举可以定义抽象方法,每个常量必须实现该方法。
enum Operation {
ADD {
public int apply(int a, int b) {
return a + b;
}
},
SUBTRACT {
public int apply(int a, int b) {
return a - b;
}
};
public abstract int apply(int a, int b);
}
public class TestEnum {
public static void main(String[] args) {
System.out.println(Operation.ADD.apply(3, 4)); // 输出: 7
System.out.println(Operation.SUBTRACT.apply(5, 2)); // 输出: 3
}
}
-
用途:为每个枚举常量定义独特的逻辑。
-
优点:将行为与常量绑定,符合策略模式。
总结
枚举类的用法非常丰富,主要包括:
-
定义常量。
-
携带属性和方法。
-
实现接口。
-
与
switch结合。 -
实现单例模式。
-
使用
EnumSet和EnumMap。 -
遍历和动态获取值。
-
定义抽象方法。
枚举的优势在于类型安全、代码简洁、线程安全以及与 Java 生态的良好集成。它特别适合表示固定集合的场景(如状态、选项、类别等),是现代 Java 编程中不可或缺的一部分。
3487

被折叠的 条评论
为什么被折叠?



