Java 枚举

本文最后更新于:2024年3月18日 凌晨

Java 枚举

  • Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
  • Java 枚举类使用 enum 关键字来定义,各个常量使用逗号, 来分割。
  • 例如定义一个颜色的枚举类。
1
2
3
4
5
enum Color{
RED,
GREEN,
BLUE;
}
  • 以上枚举类 Color 颜色常量有 RED, GREEN, BLUE,分别表示红色,绿色,蓝色。
  • 使用实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum Color{
RED,
GREEN,
BLUE;
}

public class Test
{
// 执行输出结果。
public static void main(String[] args)
{
Color c1 = Color.RED;
System.out.println(c1);
}
}
  • 执行以上代码输出结果为:
1
RED

enum类型

  • Java使用enum定义枚举类型,它被编译器编译为final class Xxx extends Enum {…},定义的enum类型总是继承自java.lang.Enum,且无法被继承。
  • 只能定义出enum的实例,而无法通过new操作符创建enum的实例,定义的每个实例都是引用类型的唯一实例。
  • 例如,我们定义的Color枚举类:
1
2
3
4
5
public enum Color {
RED,
GREEN,
BLUE;
}
  • 编译器编译出的class大概就像这样:
1
2
3
4
5
6
7
8
public final class Color extends Enum { // 继承自Enum,标记为final class
// 每个实例均为全局唯一:
public static final Color RED = new Color();
public static final Color GREEN = new Color();
public static final Color BLUE = new Color();
// private构造方法,确保外部无法调用new操作符:
private Color() {}
}
  • 所以,编译后的enum类和普通class并没有任何区别,但是我们自己无法按定义普通class那样来定义enum,必须使用enum关键字,这是Java语法规定的。

迭代枚举元素

  • 可以使用 for 语句来迭代枚举元素:
1
2
3
4
5
6
7
8
9
10
11
12
13
enum Color
{
RED,
GREEN,
BLUE;
}
public class MyClass {
public static void main(String[] args) {
for (Color myVar : Color.values()) {
System.out.println(myVar);
}
}
}
  • 执行以上代码输出结果为:
1
2
3
RED
GREEN
BLUE

在 switch 中使用枚举类

  • 枚举类常应用于 switch 语句中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
enum Color
{
RED,
GREEN,
BLUE;
}
public class MyClass {
public static void main(String[] args) {
Color myVar = Color.BLUE;
switch(myVar) {
case RED:
System.out.println("红色");
break;
case GREEN:
System.out.println("绿色");
break;
case BLUE:
System.out.println("蓝色");
break;
}
}
}
  • 执行以上代码输出结果为:
1
蓝色。

values(), ordinal()和 valueOf()方法

  • enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizablejava.lang.Comparable 两个接口。
  • values(), ordinal()valueOf() 方法位于 java.lang.Enum 类中:
    • values() 返回枚举类中所有的值。
    • name()获取常量定义的字符串,注意不要使用toString()
    • ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
    • valueOf()方法返回指定字符串值的枚举常量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
enum Color
{
RED,
GREEN,
BLUE;
}

public class Test
{
public static void main(String[] args)
{
// 调用 values()
Color[] arr = Color.values();
// 迭代枚举。
for (Color col : arr)
{
// 查看索引。
System.out.println(col + " at index " + col.ordinal());
}
// 使用 valueOf()返回枚举常量,不存在的会报错 IllegalArgumentException
System.out.println(Color.valueOf("RED"));
// System.out.println(Color.valueOf("WHITE"));
}
}
  • 执行以上代码输出结果为:
1
2
3
4
RED at index 0
GREEN at index 1
BLUE at index 2
RED

枚举类成员

  • 枚举跟普通类一样可以用自己的变量,方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@ToString
@AllArgsConstructor
@Getter
public enum UserStatusEnum {

NORMAL("NORMAL", "正常"),
PROHIBIT("PROHIBIT", "禁用");

/**
* 状态码。
*/
private final String code;

/**
* 状态描述。
*/
private final String comment;


public static UserStatusEnum parse(String code) {
for (UserStatusEnum item : UserStatusEnum.values()) {
if (ObjectUtil.equals(item.code, code)) {
return item;
}
}
return null;
}

}
  • 枚举既可以包含具体方法,也可以包含抽象方法,如果枚举类具有抽象方法,则枚举类的每个实例都必须实现它。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
enum Color{
RED{
public String getColor(){// 枚举对象实现抽象方法。
return "红色";
}
},
GREEN{
public String getColor(){// 枚举对象实现抽象方法。
return "绿色";
}
},
BLUE{
public String getColor(){// 枚举对象实现抽象方法。
return "蓝色";
}
};
public abstract String getColor();// 定义抽象方法。
}

public class Test{
public static void main(String[] args) {
for (Color c:Color.values()){
System.out.print(c.getColor() + ",");
}
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!