【Java高级语法】(十一)枚举类:还在因为使用了魔法数而被老大怼吗,一起来看看枚举器的作用吧!~-LMLPHP

1️⃣ 概念

Java枚举类(Enumerator)是在Java 5中引入的新特性,以提供一种更好的方式来表示固定数量的常量。在之前的版本中,常常使用static final修饰的变量来表示常量,但这种方式存在着一些问题,如不够清晰,容易出现错误等。因此,Java引入了枚举类作为一种更可靠、清晰和类型安全的常量表示方式。

枚举是由有限个常量值组成的数据类型,这些常量值被称为枚举常量。在Java中,枚举类是一种特殊的类,它可以定义自己的方法、字段和构造函数,并且每个枚举常量都是一个独立的实例对象。

2️⃣ 优势和缺点

优点:

  • 清晰明确:枚举类提供了一种直观的方式来表示固定的常量集合,使代码更加清晰易懂;
  • 类型安全:枚举类的值在编译期间就已经确定,因此可以保证类型的安全性;
  • 可读性强:通过给枚举常量设置具有描述性的名称,可以使代码更加易读。

缺点:

  • 灵活性较低:枚举类的常量是固定的,无法动态的增加或减少。如果需要表示的常量集合可能在运行时发生改变,则枚举类不适用。

3️⃣ 使用

定义枚举类 的基本语法如下:

enum 枚举类名 {
    枚举常量1,
    枚举常量2,
    ...
}

创建枚举实例对象 的方式如下:

枚举类名 变量名 = 枚举类名.枚举常量;

枚举类还可以有自己的字段和方法,例如:

enum Weekday {
    MONDAY("星期一"),
    TUESDAY("星期二"),
    WEDNESDAY("星期三"),
    THURSDAY("星期四"),
    FRIDAY("星期五"),
    SATURDAY("星期六"),
    SUNDAY("星期天");

    private String chineseName;

    Weekday(String chineseName) {
        this.chineseName = chineseName;
    }

    public String getChineseName() {
        return chineseName;
    }
}

下面是一个实例程序,演示了如何定义和使用Java的枚举类:

// 定义一个表示季节的枚举类
enum Season {
    SPRING("Spring", "March to May"),
    SUMMER("Summer", "June to August"),
    AUTUMN("Autumn", "September to November"),
    WINTER("Winter", "December to February");
    
    private String name; // 季节名称
    private String duration; // 季节持续时间
    
    // 枚举类的构造方法
    Season(String name, String duration) {
        this.name = name;
        this.duration = duration;
    }
    
    public String getName() {
        return name;
    }
    
    public String getDuration() {
        return duration;
    }

    @Override
    public String toString() {
        return "Season{" +
                "name='" + name + '\'' +
                ", duration='" + duration + '\'' +
                '}';
    }
}

代码说明:

  • enum Season { ... }:定义了一个枚举类Season,其中包含了四个枚举常量SPRINGSUMMERAUTUMNWINTER
  • private String name;private String duration;:类的私有成员变量,用于存储季节的名称和持续时间;
  • Season(String name, String duration):枚举类的构造方法,用于设置每个枚举常量的名称和持续时间;
  • public String getName()public String getDuration():通过这两个公共方法获取枚举常量的名称和持续时间。
public class EnumExample {
    public static void main(String[] args) {
        // 使用枚举常量
        System.out.println(Season.SPRING.getName());
        System.out.println(Season.SPRING.getDuration());
        
        // 遍历枚举常量
        System.out.println("\n遍历全部枚举:");
        for (Season season : Season.values()) {
            System.out.println(season);
        }
        
        // 使用枚举类的valueOf()方法获取枚举常量
        Season autumn = Season.valueOf("AUTUMN");
        System.out.println("\n使用valueOf()方法获取枚举:" + autumn); // 输出:Autumn
        
        // 使用switch语句根据枚举类值进行操作
        Season currentSeason = Season.SUMMER;
        switch (currentSeason) {
            case SPRING:
                System.out.println("\nIt's springtime!");
                break;
            case SUMMER:
                System.out.println("\nEnjoy your summer vacation!");
                break;
            case AUTUMN:
                System.out.println("\nWelcome to the autumn season.");
                break;
            case WINTER:
                System.out.println("\nBundle up, it's winter!");
                break;
        }
    }
}

代码说明:

  • System.out.println(Season.SPRING.getName());:使用枚举常量的名称来获取对应的字段值,并打印出来;
  • for (Season season : Season.values()) { ... }:遍历枚举常量,打印每个季节及其持续时间;
  • Season autumn = Season.valueOf("AUTUMN");:使用 valueOf() 方法获取枚举常量AUTUMN的实例;
  • switch (currentSeason) { ... }:使用 switch 语句根据当前季节进行不同的操作。

以上这个案例程序展示了枚举类的定义和使用方式,通过季节枚举类的例子,让我们可以对枚举类的概念和用法有更深入的理解。

运行结果:

Spring
March to May

遍历全部枚举:
Season{name='Spring', duration='March to May'}
Season{name='Summer', duration='June to August'}
Season{name='Autumn', duration='September to November'}
Season{name='Winter', duration='December to February'}

使用valueOf()方法获取枚举:Season{name='Autumn', duration='September to November'}

Enjoy your summer vacation!

🔍 Enum类的常用方法

以下是一些常用的Enum类的方法:

  • values(): 返回包含所有枚举值的数组;
  • valueOf(String name): 根据给定的名称返回对应的枚举常量;
  • name(): 返回枚举常量的名称;
  • ordinal(): 返回枚举常量在声明时的顺序(从0开始);
  • compareTo(EnumType e): 比较两个枚举常量在声明时的顺序,如果相同返回0,否则返回正数或负数。

这些方法可以帮助我们对枚举类型进行遍历、比较和转换等操作。此外,我们还可以为枚举类定义自己的实例字段、构造函数和方法,以满足具体需求。

上面案例已经演示了这些方法的使用方式及作用,此处不再额外演示。

4️⃣ 特征

Java的枚举类(Enum)是一种特殊的数据类型,它具有以下特征:

  1. 有限选项:枚举类定义了一个固定的、有限的选项列表。这些选项在编译时就被确定,并且不能随意更改;

  2. 单例模式:每个枚举常量在运行时只会被实例化一次,因此枚举类天然支持单例模式的实现;

  3. 安全类型:枚举类提供了类型安全性,因为它只能包含预定义的常量值,不允许任意其他的值;

  4. 可迭代:枚举类可以被遍历,可以通过values()方法获取所有枚举常量的数组,并进行迭代;

  5. 可比较:枚举类默认实现了Comparable接口,可以使用compareTo()方法进行枚举常量之间的比较;

  6. 扩展性:枚举类可以定义构造函数、成员变量和方法,也可以实现接口,从而给枚举常量添加自定义的行为;

  7. switch语句简化:在使用枚举类时,可以使用switch语句处理枚举常量,使代码结构更加清晰易懂;

  8. 序列化支持:枚举类默认实现了Serializable接口,可以通过序列化和反序列化进行存储和传输;

  9. 不可继承:枚举类默认继承 java.lang.Enum 类,而不是 Object 类,因此枚举类不能显式继承其他父类。同时,使用 enum 定义的非抽象的枚举类默认会使用 final 修饰,因此非抽象枚举类也不能派生子类(即不能被继承);

  10. 构造器权限私有:枚举类的构造器只能使用 private 访问控制符,如果忽略访问控制符的话,则默认使用 private 修饰;如果强制指定其他的访问控制符(例如public、procted等),则会报错;

  11. 代码顺序影响: 枚举类的所有实例必须在枚举类中的最前面显式列出,否则这个枚举类永远都不可能产生实例。列出的实例默认使用 public static final 修饰。枚举类的实例以逗号分隔,分号结束,这些列出的枚举值代表了该枚举类的所有可能的实例。

5️⃣ 应用场景

枚举类在很多场景中都能发挥重要作用,特别适合以下情况:

  • 定义一组相关的常量:例如表示星期几、方向、状态等;
  • 限制参数的取值范围:对于某些方法来说,其参数只能在一个预定义的范围内取值,此时可以使用枚举类;
  • 替代常数集合:在过去,常常通过使用static final变量集合来表示一组常量值,现在可以使用枚举类来替代。

🌾 总结

以上是关于Java枚举类的一些知识介绍,主要包括其概念、优势和缺点、使用方式和案例、 Enum类的常用方法、枚举类的特征及其应用场景等方面。

通过使用枚举类,可以使代码更具有可读性、可维护性,并且降低错误发生的概率。在实际开发中,根据需求的不同,可以灵活运用枚举类来达到更好的编码效果。

【Java高级语法】(十一)枚举类:还在因为使用了魔法数而被老大怼吗,一起来看看枚举器的作用吧!~-LMLPHP

06-21 23:35