什么是枚举

  • 枚举(Enum)是在Java 5中添加的新的类型
  • 从技术上来讲,由于enum是一个类,一个enum可以有构造方法和方法。如果有构造方法,那必须是私有的。如果一个enum定义了枚举值之外的其他内容,枚举值必须在其他内容之前定义,并且最后的枚举值用一个分号结束

枚举简单使用

枚举的创建

  • 创建枚举需要使用到关键字 enum ,如下所示:
    1
    2
    3
    enum Letter{
    A,B,C,D
    }
  • 标识符 A、B、C、D 等被称为枚举常量,每个枚举常量被隐式声明为Letter的公有静态final成员。每个枚举常量的类型是声明它们的枚举的类型。

枚举的使用

  • 定义了枚举后,可以创建枚举类型的变量,但是不能使用new关键字来实例化枚举,而是通过与基本类型类似的方式声明,例如:
    1
    2
    Letter letter1=Letter.A;
    Letter letter2=Letter.B;
  • 可以使用关系运算符“==”来比较两个枚举变量的相等性,例如:
    1
    2
    3
    4
    5
    if (letter1 == letter2) {
    System.out.println("相等");
    } else {
    System.out.println("不相等");
    }
  • 枚举值也可以用于控制switch语句,例如:
    1
    2
    3
    4
    5
    6
    7
    8
    switch (letter1) {
    case A:
    System.out.println("A");
    break;
    case B:
    System.out.println("B");
    break;
    }
    • 在case语句中,枚举常量的名称没有使用枚举类型的名称进行限定,即使用的是 A 而不是 Letter.A ,这是因为 switch 表达式中的枚举类型已经隐式指定了case常量的枚举类型,所以在case语句中不需要使用枚举类型的名称对常量进行限定,如果试图这么做,会造成编译时错误
  • 遍历打印枚举如下所示
    1
    2
    3
    4
    5
    6
    7
    public enum Color {
    RED, GREEN, BLANK, YELLOW
    }
    // 遍历输出
    for (Color color : Color.values()) {
    System.out.println(color);
    }
    • 输出结果为
      1
      2
      3
      4
      RED
      GREEN
      BLANK
      YELLOW

枚举是类类型

  • Java中枚举是类类型,虽然不能使用new关键字来实例化枚举,但是枚举却有和其他类相同的功能,可以为枚举提供构造函数、实例变量和方法,甚至可以实现接口

    • 需要理解的是:每个枚举变量都是所属枚举类型的对象。因此,如果为枚举定义了构造函数,那么当创建每个枚举常量时都会调用该构造函数
    • 为枚举 Letter 提供一个实例变量 index、一个返回index值的方法、两个不同的构造函数。
    • 对于每一个枚举常量,指定要调用的构造函数的方法是通过每个常量后面的圆括号中来加以指定
  • 看一下下面的案例代码

    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 Letter {

    KK(), A(1), B(2), C(3), D(5);

    private int index;

    Letter(int index) {
    this.index = index;
    }

    Letter() {
    this.index = 0;
    }

    public int getIndex() {
    return index;
    }
    }

    public static void main(String[] args) {
    Letter letter = Letter.KK;
    //输出值为:0
    System.out.println("索引:" + letter.getIndex());
    letter = Letter.B;
    //输出值为:2
    System.out.println("索引:" + letter.getIndex());
    }
  • 此外,枚举有两条限制:

    • 1.枚举不能继承其他类。但是所有枚举都隐式自动继承超类 java.lang.Enum
    • 2.枚举不能是超类。即枚举不能进行扩展

枚举的一些方法

values()

  • values() 方法返回一个包含枚举常量列表的数组,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum Letter {
    A, B, C, D
    }

    public static void main(String[] args) {
    Letter[] values = Letter.values();
    for (Letter letter : values) {
    System.out.println(letter);
    }
    }

valueOf(String)

  • valueOf(String) 方法返回与传递的字符串参数相对应的枚举常量,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    enum Letter {
    A, B, C, D
    }

    public static void main(String[] args) {
    String str = "A";
    Letter le=Letter.valueOf(str);
    //输出值为:A
    System.out.println(le);
    }

ordinal()

  • ordinal() 方法返回枚举常量在常量列表中位置的值,这称为枚举常量的序数值,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    enum Letter {
    A, B, C, D
    }

    public static void main(String[] args) {
    Letter letter = Letter.A;
    //输出值为:0
    System.out.println("序数值:" + letter.ordinal());
    letter = Letter.B;
    //输出值为:1
    System.out.println("序数值:" + letter.ordinal());
    }

compareTo(Enum)

  • compareTo(Enum) 方法用于比较相同类型的两个枚举常量的序数值,例如:

    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 Letter {
    A, B, C, D
    }

    public static void main(String[] args) {
    Letter letter1 = Letter.A;
    Letter letter2 = Letter.B;
    Letter letter3 = Letter.C;
    compare(letter1, letter2);
    compare(letter1, letter3);
    compare(letter2, letter3);
    // 输出值为:
    // A小于B
    // A小于C
    // B小于C
    }

    public static void compare(Letter letter1, Letter letter2) {
    if (letter1.compareTo(letter2) > 0) {
    System.out.println(letter1.name() + "大于" + letter2.name());
    } else if (letter1.compareTo(letter2) < 0) {
    System.out.println(letter1.name() + "小于" + letter2.name());
    } else {
    System.out.println(letter1.name() + "等于" + letter2.name());
    }
    }

equals(Enum)

  • equals(Enum)用于比较两个对象的相等性,只有两个对象都引用同一个枚举中相同的常量时,返回值才为 true

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    enum Letter {
    A, B, C, D
    }

    public static void main(String[] args) {
    Letter letter1 = Letter.A;
    Letter letter2 = Letter.B;
    Letter letter3 = Letter.A;
    //输出值:不相等
    if (letter1.equals(letter2)) {
    System.out.println("相等");
    } else {
    System.out.println("不相等");
    }
    //输出值:相等
    if (letter1.equals(letter3)) {
    System.out.println("相等");
    } else {
    System.out.println("不相等");
    }
    }

枚举实现接口

  • 枚举实现接口的案例如下所示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public interface Command {
    void execute();
    }
    public enum Color implements Command {
    RED, GREEN, BLUE;

    @Override
    public void execute() {
    switch (this) {
    case RED:
    System.out.println("选中的是红色");
    break;
    case GREEN:
    System.out.println("选中的是绿色");
    break;
    case BLUE:
    System.out.println("选中的是蓝色");
    break;
    }
    }
    }
  • 枚举实现了Command接口,在不同枚举值下执行不同的行为

    1
    2
    3
    4
    5
    6
    7
    8
    public static void main(String[] args) {
    select(Color.BLUE);
    select(Color.RED);
    }

    public static void select(Color color){
    color.execute();
    }
    • 运行结果如下
    1
    2
    选中的是蓝色
    选中的是红色
  • 而枚举Color也可以以另一种形式来实现Command接口,使用效果也完全相同

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public enum Color implements Command {

    RED {
    public void execute() {
    System.out.println("选中的是红色");
    }
    },
    GREEN {
    public void execute() {
    System.out.println("选中的是绿色");
    }
    },
    BLUE {
    public void execute() {
    System.out.println("选中的是蓝色");
    }
    };
    }