Java 枚举

在 Java 中,枚举 enum 类是一种具有一组固定常量值的类型。在本教程中,我们将通过示例学习 Java 枚举的基本概念,学习创建和使用枚举。

在本教程中,我们将通过示例学习 Java 枚举的基本概念,学习创建和使用枚举。

什么是枚举类型

在 Java 中,枚举是一种具有一组固定常量值的类型。我们使用 enum 关键字来声明枚举类。例如,

enum Size {
   SMALL, MEDIUM, LARGE, EXTRALARGE
}

在这里,我们创建了一个名为 Size 的枚举。 它包含一组固定的值: SMALL, MEDIUM, LARGE, EXTRALARGE

大括号内的这些值称为枚举常量(值)。

! **注意:**枚举常量通常以大写形式表示。

示例 1:Java 枚举

enum Size {
   SMALL, MEDIUM, LARGE, EXTRALARGE
}

public class Main {
   public static void main(String[] args) {
      System.out.println(Size.SMALL);
      System.out.println(Size.MEDIUM);
   }
}

输出

SMALL
MEDIUM

正如我们从上面的例子中看到的,我们使用枚举名称来访问常量值。

此外,我们可以创建枚举类型的变量/属性。例如,

Size pizzaSize;

这里, pizzaSize 是一个 Size 类型变量。它只能分配 4 个值。

pizzaSize = Size.SMALL;
pizzaSize = Size.MEDIUM;
pizzaSize = Size.LARGE;
pizzaSize = Size.EXTRALARGE;

示例 2:带有 switch 语句的 Java 枚举

enum Size {
 SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Test {
  Size pizzaSize;

  public Test(Size pizzaSize) {
    this.pizzaSize = pizzaSize;
  }

  public void orderPizza() {
    switch (pizzaSize) {
      case SMALL:
        System.out.println("我定了一个 小号 的披萨。");
        break;
      case MEDIUM:
        System.out.println("我定了一个 中号 的披萨。");
        break;
      default:
        System.out.println("我不知道披萨的型号。");
        break;
    }
  }
}

public class Main {
  public static void main(String[] args) {
    Test t1 = new Test(Size.MEDIUM);
    t1.orderPizza();
  }
}

输出

我定了一个 中号 的披萨。

在上面的程序中,我们创建了一个枚举类型 Size,然后我们在 Test 类中声明了一个 Size 类型的属性 pizzaSize

这里,变量 pizzaSize 只能分配 4 个值 (SMALL, MEDIUM, LARGE, EXTRALARGE)。

注意这句代码:

Test t1 = new Test(Size.MEDIUM);

它调用 Test() 类的构造方法,并传递了 Size.MEDIUM 给内部的 pizzaSize 属性。

根据传递的参数,执行switch case 语句其中一种情况。

Java 中的枚举类

在 Java 中,枚举类型被认为是一种特殊类型的类。它是随着 Java 5 的发布而引入的。

枚举类可以像常规类一样包含方法和字段。

enum Size {
    constant1, constant2, , constantN;

    // methods and fields
}

当我们创建一个枚举类时,编译器会创建每个枚举常量的实例(对象)。并且,默认情况下所有枚举常量始终是 public static final

示例 3:Java 枚举类

enum Size{
  SMALL, MEDIUM, LARGE, EXTRALARGE;

  public String getSize() {

    // this 就是当前的枚举对象
    switch(this) {
      case SMALL:
        return "小号";

      case MEDIUM:
        return "中号";

      case LARGE:
        return "大号";

      case EXTRALARGE:
        return "超大号";

      default:
        return null;
      }
   }

  public static void main(String[] args) {

    // call getSize()
    // using the object SMALL
    System.out.println("披萨的型号是:" + Size.SMALL.getSize());
  }
}

输出

披萨的型号是:小号

在这里,我们创建了一个名为 Size 的枚举。 它包含一组固定的值: SMALL, MEDIUM, LARGE, EXTRALARGE

Size 是一个枚举类,编译器会自动为每个枚举常量创建实例。

main() 方法内部,我们使用 Size.SMALL 调用 getSize() 方法。

注意:与常规类一样,枚举类也可能包含构造方法。

枚举的构造方法

在 Java 中,枚举类可能像常规类一样包含构造方法。只是枚举的构造方法必须是私有 private 的,因为您不能在枚举类外面构造枚举对象。

示例:枚举构造方法

enum Size {

  // 调用构造方法
  SMALL("小号"),
  MEDIUM("中号"),
  LARGE("大号"),
  EXTRALARGE("超大号");

  private final String desc;

  // 私有构造方法
  private Size(String desc) {
    this.desc = desc;
  }

  public String getDesc() {
    return desc;
  }
}

public class Main {
  public static void main(String[] args) {
    Size size = Size.SMALL;
    System.out.println(size.getDesc());
  }
}

输出

小号

在上面的例子中,我们创建了一个枚举类型 Size,它包括一个 private 枚举构造方法。构造方法接受一个字符串值作为参数,该参数是对常量的中文描述。

由于构造方法是 private ,我们无法从类外部访问它。但是我们可以在枚举类内部调用构造方法。

同时我们在枚举类中定义了 getDesc() 方法,该方法返回当前枚举对象的中文描述。

! 注意: 由于枚举类的构造方法默认就是 private 的,因此,构造方法前面的 private 关键字是可以省略的。

Java 枚举类的方法

枚举类中有一些预定义的方法可供使用。

ordinal()

ordinal() 方法按照每个枚举常量的顺序返回枚举常量的排序数。例如,

Size.SMALL.ordinal() // 返回 0

compareTo()

compareTo() 方法根据序数值比较枚举常量,返回两个枚举常量的 ordinal() 的差值。例如,

Size small = Size.SMALL;
Size large = Size.LARGE;
small.compareTo(large); // -2

toString()

toString() 方法返回枚举常量的字符串表示形式。例如,

Size.SMALL.toString() // "SMALL"

name()

name() 方法以字符串形式返回枚举常量的定义名称。name() 方法的返回值为 final 。例如,

Size.SMALL.name() // "SMALL"

valueOf()

valueOf() 方法接受一个字符串并返回一个具有相同字符串名称的枚举常量。例如,

Size.valueOf("SMALL") // Size.SMALL

values()

values() 方法返回一个包含所有枚举常量的枚举类型数组。例如,

Size[] enumArray = Size.values();

为什么使用枚举?

在 Java 中引入了 enum 枚举来代替其他常量的使用,这样会让常量更有意义,使用起来也更安全。

在没有枚举之前,我们通常使用下面的方式来建立常量:

public class Size {
   public final static int SMALL = 1;
   public final static int MEDIUM = 2;
   public final static int LARGE = 3;
   public final static int EXTRALARGE = 4;
}

在这里,如果我们打印常量就很难看出值的真实意义。这是因为只打印了可能没有任何信息的数字。

因此,我们可以简单地使用枚举,而不是使用 int 常量。例如,

enum Size {
   SMALL, MEDIUM, LARGE, EXTRALARGE
}

这使我们的代码更加直观。

此外, enum 提供编译时类型安全

如果我们声明一个变量 尺寸类型。例如,

Size size;

这就保证了变量只能赋值枚举类中的四个值之一,如果我们尝试传递这四个值以外的值,编译器将产生错误。