枚举类(Enum)

1. 什么是枚举类?

枚举(enum)是一种特殊的类,表示一组固定的常量。它在 Java、C++、Python 等编程语言中广泛应用,通常用于定义状态、类型、方向等不可变值。


2. Java 枚举的基本使用

Java 枚举使用 enum 关键字定义,例如:

1
2
3
public enum Color {
RED, GREEN, BLUE;
}

特点

  • enum 实际上是一个类,继承自 java.lang.Enum
  • 枚举的实例是固定的、有限的,不能通过 new 创建新实例。
  • 每个枚举值本质上是 Color 类的一个静态实例。

使用示例

1
2
Color c = Color.RED;
System.out.println(c); // 输出:RED

3. 枚举类的常见用法

(1)枚举类中定义属性和方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public enum Status {
SUCCESS(200, "OK"),
ERROR(500, "Server Error"),
NOT_FOUND(404, "Not Found");

private final int code;
private final String message;

// 构造方法(必须是 private)
private Status(int code, String message) {
this.code = code;
this.message = message;
}

public int getCode() {
return code;
}

public String getMessage() {
return message;
}
}

使用:

1
2
System.out.println(Status.SUCCESS.getCode());    // 输出:200
System.out.println(Status.SUCCESS.getMessage()); // 输出:"OK"

(2)枚举类中的抽象方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public enum Operation {
ADD {
@Override
public int apply(int a, int b) {
return a + b;
}
},
SUBTRACT {
@Override
public int apply(int a, int b) {
return a - b;
}
};

public abstract int apply(int a, int b);
}

使用:

1
2
int result = Operation.ADD.apply(5, 3); // 5 + 3 = 8
System.out.println(result);

(3)遍历枚举值

1
2
3
(Color c : Color.values()) {
System.out.println(c);
}

输出:

1
2
3
RED
GREEN
BLUE

(4)枚举类的 valueOf 方法

1
2
Color c = Color.valueOf("RED");
System.out.println(c); // 输出:RED
  • valueOf("RED") 必须匹配 enum 中的名称(区分大小写)。
  • 如果传入 "red",会抛出 IllegalArgumentException

4. 枚举实现单例模式(推荐)

枚举是实现单例模式的最佳方式,线程安全防止反射破坏防止序列化破坏

1
2
3
4
5
6
7
public enum Singleton {
INSTANCE;

public void doSomething() {
System.out.println("Hello, Singleton!");
}
}

使用:

1
Singleton.INSTANCE.doSomething();

5. 总结

特性 描述
继承 enum 默认继承 java.lang.Enum,不能再继承其他类
线程安全 enum 本质上是 final,且实例是静态的,天然线程安全
构造方法 必须是 private,外部不能 new 构造
反射安全 反射无法创建新的 enum 实例
序列化安全 enum 反序列化时不会创建新对象,保证单例

适用场景

  • 定义常量集合(如 HTTP 状态码、星期、颜色等)
  • 替代 switch-case 语句中的字符串或整数
  • 实现策略模式
  • 单例模式(推荐使用)

枚举不仅仅是常量的集合,它可以包含方法、构造函数,甚至实现接口,使其更加强大和灵活。