• Java中的枚举类型——Enum


    一、认识枚举

    枚举是在JDK1.5后引入的,主要作用是将一组常量组织起来进行统一管理。

    应用场景:错误状态码、消息类型、颜色划分……

    自定义的枚举类都会默认继承于java.lang.Enum,因此自定义的枚举类就可以使用Enum类中的方法:

    Enum中的常用方法
    方法名称作用
    values()以数组的形式返回枚举类型中的所有成员
    ordinal()获取枚举成员的索引位置
    valueOf()将普通字符串转换为枚举实例
    compareTo()比较两个枚举成员的定义顺序

    注意:values()方法比较特殊,代码在编译后才会自动生成这个方法,所以我们在编写代码时是看不到这个方法的源码的。

    二、枚举的使用

    我们先自定义一个简单的枚举类:

    1. public enum TestEnum {
    2. RED,GREEN,BLUE,YELLOW;
    3. }

    1、switch语句的判定

    枚举对象可以用于switch语句的判定条件:

    1. public static void main(String[] args) {
    2. TestEnum test = TestEnum.RED;
    3. switch (test){
    4. case RED:
    5. System.out.println("red");
    6. break;
    7. case GREEN:
    8. System.out.println("green");
    9. break;
    10. case BLUE:
    11. System.out.println("blue");
    12. break;
    13. case YELLOW:
    14. System.out.println("yellow");
    15. break;
    16. default:
    17. break;
    18. }
    19. }

    代码运行结果:

    2、values()方法和ordinal()方法的使用

    1. public static void main(String[] args) {
    2. //将自定义枚举类型中的所有对象以数组的形式返回
    3. TestEnum[] testEnums = TestEnum.values();
    4. for (int i = 0; i < testEnums.length; i++) {
    5. //输出每个对象及其对应的序号
    6. System.out.println(testEnums[i]+"序号:"+testEnums[i].ordinal());
    7. }
    8. }

    代码运行结果:

    3、valueOf()方法的使用

    1. public static void main(String[] args) {
    2. //输入的字符串必须是上面的实例之一
    3. System.out.println(TestEnum.valueOf("RED"));
    4. System.out.println(TestEnum.valueOf("GREEN"));
    5. //否则会抛出IllegalArgumentException异常
    6. System.out.println(TestEnum.valueOf("BLACK"));
    7. }

    代码运行结果: 

    4、compareTo方法的使用

    1. public static void main(String[] args) {
    2. System.out.println(RED.compareTo(GREEN));
    3. System.out.println(BLUE.compareTo(YELLOW));
    4. System.out.println(YELLOW.compareTo(RED));
    5. }

    代码运行结果: 

    5、枚举类的构造方法

    枚举类中的构造方法默认是一个无参的构造方法,我们也可以自定义构造方法:

    1. public enum TestEnum {
    2. RED("RED",1),GREEN("GREEN",2),
    3. BLUE("BLUE",3),YELLOW("YELLOW",4);
    4. public String color;
    5. public int ordinal;
    6. private TestEnum(String color,int ordinal){
    7. this.color = color;
    8. this.ordinal = ordinal;
    9. }
    10. }

    枚举类型的构造方法默认是被private修饰的,如果改为其它的访问权限会报错。

    三、枚举和反射

    既然枚举类型的构造方法默认是被private修饰的,那么能否通过反射的方式来实例化一个枚举对象呢? 

    1. public static void main(String[] args) {
    2. //获取TestEnum的Class对象
    3. Class c = TestEnum.class;
    4. try {
    5. //还需要给父类Enum的构造方法进行传参
    6. Constructor constructor =
    7. c.getDeclaredConstructor(String.class,int.class,String.class,int.class);
    8. //设置为true后可以修改访问权限
    9. constructor.setAccessible(true);
    10. //父类参数不给也可以,默认为空
    11. TestEnum testEnum =
    12. (TestEnum) constructor.newInstance("WHITE",5,"父类的参数",999);
    13. System.out.println(testEnum);
    14. } catch (NoSuchMethodException e) {
    15. e.printStackTrace();
    16. } catch (InvocationTargetException e) {
    17. e.printStackTrace();
    18. } catch (InstantiationException e) {
    19. e.printStackTrace();
    20. } catch (IllegalAccessException e) {
    21. e.printStackTrace();
    22. }
    23. }

    注意:

    自定义的枚举类型默认继承于标准库里的Enum类,Enum中只有一个构造方法:

    我们在构造子类对象之前需要先帮助父类构造,所以调用getDeclaredConstructor方法时需要给4个参数,2个是自定义枚举类TestEnum构造方法的参数类型,2个是父类Enum构造方法的参数类型。

    代码运行结果:

    抛出IllegalArgumentException异常,并提示说:Cannot reflectively create enum objects,不能反射式创建enum对象

  • 相关阅读:
    【开源】基于Vue.js的开放实验室管理系统的设计和实现
    【SA8295P 源码分析 (一)】118 - QNX 如何进入 Recovery Mode 模式 及 如何配置挂载 USB3.0 U盘
    号码认证平台有哪些?号码认证平台费用?
    c++的多态,继承,抽象类,虚函数表,虚函数等题目+分析
    Shell脚本:三剑客(AWK)
    docker镜像命令
    Nest.js项目初始配置
    python基础语法:字符串格式化
    vulnhub靶场之ADROIT: 1.0.1
    虹科方案丨自动驾驶多传感器数据融合方法
  • 原文地址:https://blog.csdn.net/m0_67683346/article/details/126831453