Enum(枚举)的定义

一、理论说明

1. Enum(枚举)的定义

在 Java 中,Enum是一种特殊的数据类型,用于定义一组固定的常量。它是java.lang.Enum类的子类,每个枚举常量都是该枚举类型的一个实例。Enum类型提供了类型安全的方式来定义一组相关的常量,例如表示星期几、季节、颜色等。枚举常量在编译时就被确定下来,不能被修改或删除,这保证了数据的一致性和安全性。

2. Enum与普通类以及常量接口的区别
  • 与普通类的区别
    • 定义方式:普通类是使用class关键字定义,而Enum使用enum关键字定义。
    • 实例化:普通类可以通过构造函数多次实例化多个对象,而枚举类型的常量在定义时就已经确定,并且是单例的,不能通过构造函数进行实例化(枚举的构造函数是私有的)。
    • 功能特性:枚举类型可以有自己的方法和属性,并且可以实现接口,但不能继承其他类(因为隐式继承了java.lang.Enum)。普通类可以继承其他类、实现多个接口,具有更灵活的继承和多态特性。
  • 与常量接口的区别
    • 类型安全性:常量接口只是定义了一组公共静态常量,在使用时可能会出现类型不匹配的问题,因为它只是简单的常量集合。而枚举类型是一种强类型,每个枚举常量都有其特定的类型,提供了更好的类型安全性。
    • 扩展性:常量接口一旦定义,其常量集合就固定了,难以进行扩展。枚举类型可以方便地添加新的枚举常量,并且还可以为枚举常量添加方法和属性,具有更好的扩展性。
    • 使用场景:常量接口适用于简单的常量集合,例如数学常量、配置参数等。枚举类型更适合表示有限的、固定的一组值,并且这些值之间可能存在一定的逻辑关系,例如订单状态、权限级别等。

二、常用方法

1. values()方法

该方法是由编译器自动为枚举类型生成的静态方法,用于返回一个包含该枚举类型所有常量的数组。例如:

enum Season {
    SPRING, SUMMER, AUTUMN, WINTER
}

public class Main {
    public static void main(String[] args) {
        Season[] seasons = Season.values();
        for (Season season : seasons) {
            System.out.println(season);
        }
    }
}
2. valueOf(String name)方法

此方法也是编译器自动生成的静态方法,用于根据指定的名称返回对应的枚举常量。如果指定的名称不存在,则会抛出IllegalArgumentException异常。例如:

enum Color {
    RED, GREEN, BLUE
}

public class Main {
    public static void main(String[] args) {
        try {
            Color color = Color.valueOf("RED");
            System.out.println(color);
        } catch (IllegalArgumentException e) {
            System.out.println("不存在该颜色枚举常量");
        }
    }
}
3. ordinal()方法

该方法返回枚举常量在枚举类型中的位置(索引),从 0 开始计数。例如:

enum DayOfWeek {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

public class Main {
    public static void main(String[] args) {
        DayOfWeek wednesday = DayOfWeek.WEDNESDAY;
        int ordinal = wednesday.ordinal();
        System.out.println("星期三在枚举中的位置是: " + ordinal);
    }
}
4. name()方法

此方法返回枚举常量的名称,与定义时的名称相同。例如:

enum Fruit {
    APPLE, BANANA, ORANGE
}

public class Main {
    public static void main(String[] args) {
        Fruit apple = Fruit.APPLE;
        String name = apple.name();
        System.out.println("苹果枚举常量的名称是: " + name);
    }
}

三、应用实例

以下代码应用了以上四个方法:

import java.util.Scanner;

enum OrderStatus {
    CREATED, PROCESSING, SHIPPED, DELIVERED, CANCELLED
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("所有订单状态:");
        OrderStatus[] statuses = OrderStatus.values();
        for (OrderStatus status : statuses) {
            System.out.println(status);
        }

        System.out.println("请输入一个订单状态名称:");
        String input = scanner.nextLine();
        try {
            OrderStatus selectedStatus = OrderStatus.valueOf(input);
            System.out.println("你输入的订单状态是: " + selectedStatus);
            System.out.println("该订单状态在枚举中的位置是: " + selectedStatus.ordinal());
            System.out.println("该订单状态的名称是: " + selectedStatus.name());
        } catch (IllegalArgumentException e) {
            System.out.println("不存在该订单状态");
        }

        scanner.close();
    }
}
代码解释
  • 展示所有枚举常量:通过OrderStatus.values()方法获取OrderStatus枚举类型的所有常量,并遍历输出。
  • 获取指定枚举常量:提示用户输入一个订单状态名称,使用OrderStatus.valueOf(input)方法尝试获取对应的枚举常量。如果输入的名称有效,则进一步展示该枚举常量的位置(通过ordinal()方法)和名称(通过name()方法);如果输入的名称无效,则捕获异常并提示用户不存在该订单状态。

四、面试题

题目:

答案:

自我总结

通过对Enum(枚举)的学习,我们了解到它在定义固定常量集合时的重要性和优势。与普通类和常量接口相比,Enum在定义方式、实例化、类型安全性、扩展性和使用场景等方面都有明显的差异。掌握values()valueOf(String name)ordinal()name()等常用方法,能够让我们在实际编程中根据不同需求灵活运用枚举类型。在实际应用场景中,如表示状态、类型分类、选项集合等,Enum都能发挥其独特优势,提高代码的可读性、类型安全性和可维护性。同时,合理使用枚举类型的方法和特性,可以更好地组织和管理代码中的常量数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值