前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java5 枚举(Enum)

Java5 枚举(Enum)

原创
作者头像
HLee
修改2021-09-10 11:23:25
1.1K0
修改2021-09-10 11:23:25
举报
文章被收录于专栏:房东的猫房东的猫

简介

enum的全称为 enumeration, 是 JDK 1.5 中引入的新特性。在Java中,被enum关键字修饰的类型就是枚举类型,此类继承了Enum类,形式如下:

public enum ColorEnum {
    RED, // 代表ColoeEnum的一个对象
    GREEN,
    BLUE
}

如果枚举不添加任何方法,枚举值默认为从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)); 

4
5
-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()); 

0
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
RED
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 是抽象类,其有两个实现:RegularEnumSetJumboEnumSet,选择哪一个取决于实例化时枚举中常量的数量。

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 删除。

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 枚举类
    • 定义枚举类
      • 枚举类的成员变量、成员方法、构造器
        • 枚举类中的常用方法
          • 1. int compareTo(E o)
          • 2. String name()
          • 3. static values()
          • 4. String toString()
          • 5. int ordinal()
          • 6. static valueOf()
          • 7. boolean equals()方法
      • 枚举类实现接口
      • 枚举类实现构造方法
      • 枚举类实现抽象方法
      • EnumSet
      • EnumMap
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档