备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
3 1

海报分享

原创

Java5 枚举(Enum)

简介

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, "星期一");

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。