简介
enum
的全称为 enumeration, 是 JDK 1.5 中引入的新特性。
在Java中,被
enum
关键字修饰的类型就是枚举类型,此类继承了Enum类,
形式如下:
public enum ColorEnum {
RED, // 代表ColoeEnum的一个对象
GREEN,
}
如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。
以 Color枚举类型举例,它的枚举常量依次为
RED:0,GREEN:1,BLUE:2
。
枚举的好处:可以将常量组织起来,统一进行管理。尽管
enum
看起来像是一种新的数据类型,事实上,enum是一种受限制的类,并且具有自己的方法。
枚举类
-
在某些情况下,一个类的对象是有限且固定的,如季节类,它只有春夏秋冬4个对象这种实例有限且固定的类,在 Java 中被称为枚举类;
-
在 Java中使用enum关键字来定义枚举类,其地位与 class、interface 相同;
-
枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器 (只能使用 private 访问修饰符,所以无法从外部调用构造器,构造器只在构造枚举值时被调用);
-
一个Java源文件中最多只能有一个public类型的枚举类,且该Java源文件的名字也必须和该枚举类的类名相同,这点和类是相同的;
-
使用 enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口;
-
所有的枚举值都是 public static final 的
,且非抽象的枚举类不能再派生子类;
-
枚举类的所有实例(枚举值)必须在枚举类的第一行显式地列出,否则这个枚举类将永远不能产生实例。列出这些实例(枚举值)时,系统会自动添加 public static final 修饰,无需程序员显式添加。
定义枚举类
// 定义一个星期的枚举类
public enum WeekEnum {
// 在第一行显式地列出7个枚举实例(枚举值),系统会自动添加 public static final 修饰
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}
枚举类的成员变量、成员方法、构造器
public enum WeekEnum {
* 因为已经定义了带参数的构造器,所以在列出枚举值时必须传入对应的参数
SUNDAY("星期日"), MONDAY("星期一"), TUESDAY("星期二"), WEDNESDAY("星期三"),
THURSDAY("星期四"), FRIDAY("星期五"), SATURDAY("星期六");
* 定义一个 private 修饰的实例变量
private String date;
* 定义一个带参数的构造器,枚举类的构造器只能使用 private 修饰
* @param date
WeekEnum(String date) {
this.date = date;
* 定义 get set 方法
* @return
public String getDate() {
return date;
public void setDate(String date) {
this.date = date;
* 重写 toString() 方法
* @return
@Override
public String toString(){
return date;
}
枚举类中的常用方法
1. int compareTo(E o)
描述:该方法用于与制定枚举对象比较顺序,同一个枚举实例只能与相同类型的枚举实例比较。如果该枚举对象位于指定枚举对象之后,则返回正整数;反之返回负整数;否则返回零;
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.MONDAY));
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.SUNDAY));
System.out.println(WeekEnum.FRIDAY.compareTo(WeekEnum.SATURDAY));
-1
2. String name()
描述:返回此枚举实例的名称,即枚举值。
3. static values()
描述:返回一个包含全部枚举值的数组,可以用来遍历所有枚举值。
// 没有重写 toString 方法
for (WeekEnum we : WeekEnum.values()) {
System.out.println(we);
SUNDAY
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
4. String toString()
描述:返回枚举值的名称,与 name 方法类似,更常用。
// 没有重写 toString 方法
for (WeekEnum we : WeekEnum.values()) {
System.out.println(we);
星期六
5. int ordinal()
描述:返回枚举值在枚举类中的索引值(从0开始),即枚举值在枚举声明中的顺序,这个顺序根据枚举值声明的顺序而定。
System.out.println(WeekEnum.SUNDAY.ordinal());
System.out.println(WeekEnum.FRIDAY.ordinal());
5
6. static valueOf()
描述:返回带指定名称的指定枚举类型的枚举常量,名称必须与在此类型中声明枚举常量所用的标识符完全匹配(不允许使用额外的空白字符)。这个方法与toString相对应,因此重写 toString() 方法,一定要重写 valueOf() 方法(我们可以重写 toString() 方法,但不能自己重写 valueOf() 方法,当我们重写 toString() 方法时,valueOf() 方法会自动重写,不用我们理会);
System.out.println(WeekEnum.valueOf(WeekEnum.class, "MONDAY"));
System.out.println(WeekEnum.valueOf(WeekEnum.class, "FRIDAY"));
System.out.println(WeekEnum.valueOf(WeekEnum.class, "SUNDAY"));
星期日
7. boolean equals()方法
描述:比较两个枚举类对象的引用。
枚举类实现接口
与普通类一样,枚举类也可以实现一个或多个接口。枚举类实现接口时,同样要实现该接口的所有方法。
public interface GenderDescription {
void info();
}
public enum Gender implements GenderDescription {
MALE, FEMALE;
@Override
public void info() {
System.out.println("这是一个用于定义性别的枚举类");
}
Gender.MALE.info();
Gender.FEMALE.info();
这是一个用于定义性别的枚举类
这是一个用于定义性别的枚举类
枚举类实现构造方法
public enum Color {
RED(10), GREEN, BLUE(30);
private int color;
Color() {
System.out.println("color无参构造器");
Color(int color) {
this.color = color;
System.out.println("color有参构造器: " + color);
// 会同时实例化Color中的全部实例对象
System.out.println(Color.RED);
System.out.println(Color.GREEN);
color有参构造器: 10
color无参构造器
color有参构造器: 30
GREEN
枚举类实现抽象方法
定义一个 Operation 枚举类,有4个枚举值PLUS、MINUS、TIMES、DIVIDE,分别代表加、减、乘、除,该枚举类有一个 calculate() 方法,用于完成计算。
public enum Operation {
* 用于执行加法运算
PLUS { // 花括号部分其实是一个匿名内部子类
@Override
public double calculate(double x, double y) {
return x + y;
* 用于执行减法运算
MINUS { // 花括号部分其实是一个匿名内部子类
@Override
public double calculate(double x, double y) {
// TODO Auto-generated method stub
return x - y;
* 用于执行乘法运算
TIMES { // 花括号部分其实是一个匿名内部子类
@Override
public double calculate(double x, double y) {
return x * y;
* 用于执行除法运算
DIVIDE { // 花括号部分其实是一个匿名内部子类
@Override
public double calculate(double x, double y) {
return x / y;
* 为该枚举类定义一个抽象方法,枚举类中所有的枚举值都必须实现这个方法
* @param x
* @param y
* @return
public abstract double calculate(double x, double y);
}
System.out.println("6 + 2 = " + Operation.PLUS.calculate(6, 3));
System.out.println("6 - 2 = " + Operation.MINUS.calculate(6, 2));
System.out.println("6 * 2 = " + Operation.TIMES.calculate(6, 2));
System.out.println("6 / 2 = " + Operation.DIVIDE.calculate(6, 2));
6 + 2 = 9.0
6 - 2 = 4.0
6 * 2 = 12.0
6 / 2 = 3.0
EnumSet
EnumSet
是一种专门为枚举类型所设计的
Set
类型。
与
HashSet
相比,由于使用了内部位向量表示,因此它是特定
Enum
常量集的非常有效且紧凑的表示形式。它提供了类型安全的替代方法,以替代传统的基于int的“位标志”,使我们能够编写更易读和易于维护的简洁代码。
EnumSet
是抽象类,其有两个实现:
RegularEnumSet
、
JumboEnumSet
,选择哪一个取决于实例化时枚举中常量的数量。
EnumSet<WeekEnum> enumSet = EnumSet.allOf(WeekEnum.class);
for (WeekEnum weekEnum : enumSet) {
System.out.println(weekEnum);
}
EnumMap
EnumMap
是一个专门化的映射实现,用于将枚举常量用作键。
与对应的
HashMap
相比,它是一个高效紧凑的实现,并且在内部表示为一个数组:
EnumMap<WeekEnum, String> enumMap = new EnumMap<WeekEnum, String>(WeekEnum.class);
enumMap.put(WeekEnum.MONDAY, "星期一");