Java Enum 枚举类

一、简介

枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男”或者“女”,一周的星期只能是 7 天中的一个等。类似这种当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型。

在 JDK 1.5 之前没有枚举类型,那时候一般用接口常量来替代。而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。

  1. 枚举类代表一组常量;
  2. 枚举常量隐性声明为final static类型;
  3. 每一个枚举常量代表了一个枚举类的对象;
  4. 枚举类隐性实现了java.lang.Comparable接口和java.io.Serializable接口
  5. 枚举类可以包涵多个构造函数

声明枚举时必须使用 enum 关键字,然后定义枚举的名称、可访问性、基础类型和成员等。枚举声明的语法如下:

1
2
3
enum-modifiers enum enumname:enum-base {
enum-body,
}

其中,

  • enum-modifiers 表示枚举的修饰符主要包括 public、private 和 internal;
  • enumname 表示声明的枚举名称;
  • enum-base 表示基础类型;
  • enum-body 表示枚举的成员,它是枚举类型的命名常数。

任意两个枚举成员不能具有相同的名称,且它的常数值必须在该枚举的基础类型的范围之内,多个枚举成员之间使用逗号分隔。

二、默认枚举类

枚举类首先定义常量,其次才是属性、构造函数和方法。(注:常量名要大写)

1
2
3
4
5
6
7
8
9
10
11
12
 //创建默认枚举类
public enum DefaultEnum {
DEMOENUM1, DEMOENUM2, DEMOENUM3;
}

//访问枚举对象
public class client {
public static void main(String[] args) {
DefaultEnum demoEnum = DefaultEnum.DEMOENUM1;
System.out.println(demoEnum); //输出:DEMOENUM1
}
}

三、多值枚举对象

枚举对象可以包涵一个或多个值,值的类型可以任意基本类型。枚举对象的值在枚举类中定义后可定义setter方法修改,但是如非必要不要这么做,因为这会违背枚举对象常量的本质。

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
30
31
32
33
//创建枚举类
public enum MutiValueEnum {

DEMOENUM1(1, "hello"),
DEMOENUM2(2, "enum");

//枚举对象的变量
private int id;
private String value;

//重写枚举类的默认构造器
MutiValueEnum(int id, String value) {
this.id = id;
this.value = value;
}

//获得id属性的值
public int getId() { return this.id; }

//获得value属性的值
public String getValue() { return this.value; }
}

//访问枚举对象
public class client {
public static void main(String[] args) {
MutiValueEnum mutiValueEnum = MutiValueEnum.DEMOENUM1;

System.out.println(mutiValueEnum);//输出:DEMOENUM1
System.out.println(mutiValueEnum.getId());//输出:1
System.out.println(mutiValueEnum.getValue());//输出:hello
}
}

四、属性和方法

Java 中的每一个枚举都继承自 java.lang.Enum 类。当定义一个枚举类型时,每一个枚举类型成员都可以看作是 Enum 类的实例,这些枚举成员默认都被 final、public, static 修饰,当使用枚举类型成员时,直接使用枚举名称调用成员即可。

枚举类里的属性和方法是属于枚举常量的,所以枚举常量可以调用这些方法。我们可以在枚举类定义其他我们所需要的方法。其实,枚举类同正常类有许多相似之处,对于变量和方法,我们可以按照正常类里的属性和方法去使用,只不过我们不能通过new来创建对象,而是枚举类自行创建。注:枚举类里不能有抽象方法。

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
//测试枚举类的属性和方法
public enum TestAttributeAndMethodOfEnum {
DEMOENUM;

private int id;
private String value;
private boolean flag;

//setter and getter


//other method
public void TestMethod1() { … }
public void TestMethod2() { … }
}

//测试类
public class Client {
public static void main(String[] args) {
TestAttributeAndMethodOfEnum testEnum = TestAttributeAndMethodOfEnum.DEMOENUM;

testEnum.setId(1);
testEnum.TestMethod1();

}

}

五、构造函数

同正常类一样,枚举类可以拥有多个构造函数。构造函数的参数要同枚举常量的值的数量相一致。并且枚举类的构造函数的可见性只能设为包可见或是私有,其次也不能通过new来创建枚举对象。由枚举类的使用类负责枚举对象的构建。

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
30
31
32
33
34
35
36
37
38
39
40
41
enum Color { 
RED,
GREEN("light"),
BLUE(255,23,223);

private String level;
private int r,g,b;

//默认无参构造,在此可省略
//Color() { }

//对应一个值的GREEN常量
Color(String level) {
this.level = level;
}
//对应三个值的BLUE常量
Color(int r, int g, int b) {
this.r = r;
this.g = g;
this.b = b;
}
}

public class Test {
// Driver method
public static void main(String[] args) {
Color c1 = Color.RED;
Color c2 = Color.GREEN;
Color c3 = Color.BLUE;
System.out.println(c1);

}
}


//在上述例子中,枚举类会被内部的转换为
class Color{
public static final Color RED = new Color();
public static final Color GREEN = new Color("light");
public static final Color BLUE = new Color(255, 23, 223);
}

六、重要方法

  • values() 返回枚举类的所有常量;
  • ordinal() 返回枚举常量的序号
  • valueOf(String name) 返回名为name的枚举常量,如果存在。
  • compareTo() 比较两个枚举成员在定义时的顺序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 演示 values(), ordinal() 和 valueOf() 方法
enum Color {
RED, GREEN, BLUE;
}

public class Test {
public static void main(String[] args) {
Color arr[] = Color.values();

for (Color col : arr) {
System.out.println(col + " at index " + col.ordinal());
}

System.out.println(Color.valueOf("RED"));
//此行代码会返回IllegalArgumentException 异常,因为Color枚举类里没有名为WHITE的常量
System.out.println(Color.valueOf("WHITE"));
}
}

Java Enum 枚举类
https://flepeng.github.io/021-Java-31-语法-Java-Enum-枚举类/
作者
Lepeng
发布于
2023年3月24日
许可协议