Java枚举的使用与反射应用方式

 更新时间:2024年09月23日 15:22:00   作者:夏诗曼CharmaineXia  
枚举类型是一种特殊的类,限定为固定实例集合,且是类型安全和线程安全的,枚举类型不可继承,但可以添加属性和方法,支持单例模式,枚举常量可以通过反射获取和操作,提供了灵活性和扩展性
  • 单例模式:枚举类型是一种有限实例的类,枚举常量在定义时就被限定为一组固定的实例,不能动态添加或修改。每个枚举常量都是枚举类型的实例,因此枚举类型天然地支持单例模式。
  • 类型安全:枚举类型是类型安全的,编译器会在编译时检查枚举值的合法性,避免使用无效的枚举常量,在多线程环境下使用枚举类型是线程安全的。
  • 不可继承:枚举类型默认是final修饰的,不能被继承,因为枚举类型已经提供了固定的实例集合。
  • 可添加属性和方法:枚举类型可以拥有字段、方法和构造函数,可以为每个枚举常量添加属性和行为。

一、定义方式

Java枚举是一种特殊的数据类型,用于定义一组常量集合,可以定义简单的枚举常量,也可以为枚举常量添加属性和方法。

1.1 简单定义

// 定义表示星期的枚举类型
public enum Weekday {
    MONDAY, // 星期一
    TUESDAY, // 星期二
    WEDNESDAY, // 星期三
    THURSDAY, // 星期四
    FRIDAY, // 星期五
    SATURDAY, // 星期六
    SUNDAY // 星期日
}

1.2 带参数定义

带参数定义允许枚举常量携带额外信息,使枚举更具灵活性。

// 定义表示季节的枚举类型,每个季节携带中文名称
public enum Season {
    SPRING(1,"春天"), 
    SUMMER(2,"夏天"), 
    AUTUMN(3,"秋天"), 
    WINTER(4,"冬天"); 

	private Integer index; 
    private String chineseName; 

    public Integer getIndex() {return index;}
    public String getChineseName() {
        return chineseName;
    }
}

枚举类型可以通过values()方法获取所有枚举常量的数组,方便遍历枚举值。

    public static String getByCode(Integer index){
        for(Season season : values()){
            if (season.getIndex() == index) {
                return getIndex.getChineseName();
            }
        }
        return null;
    }

二、反射应用

1. 反射获取枚举常量

public class EnumReflectionExample {

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

    public static void main(String[] args) {
        // 获取枚举类对象
        Class<Day> enumClass = Day.class;

        // 获取枚举常量
        Day[] days = enumClass.getEnumConstants();
        for (Day day : days) {
            System.out.println(day);
        }
    }
}

2. 反射获取枚举属性

public class EnumReflectionExample {

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

        private String chineseName;

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

        public String getChineseName() {
            return chineseName;
        }
    }

    public static void main(String[] args) {
        // 获取枚举类对象
        Class<Day> enumClass = Day.class;

        // 获取枚举属性
        try {
            Field chineseNameField = enumClass.getDeclaredField("chineseName");
            chineseNameField.setAccessible(true);

            for (Day day : Day.values()) {
                String chineseName = (String) chineseNameField.get(day);
                System.out.println(day + " 的中文名是:" + chineseName);
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

3. 动态调用枚举方法

public class EnumReflectionExample {

    enum Day {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

        public void sayHello() {
            System.out.println("今天是:" + this);
        }
    }

    public static void main(String[] args) {
        // 动态调用枚举方法
        try {
            Day monday = Day.valueOf("MONDAY");
            monday.sayHello();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }
    }
}

4. 动态设置枚举属性

public class EnumReflectionExample {

    enum Day {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;

        private String description;

        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }
    }

    public static void main(String[] args) {
        // 动态设置枚举属性
        Day monday = Day.MONDAY;
        monday.setDescription("星期一");
        System.out.println(monday.getDescription());
    }
}

5. 判断枚举类型

public class EnumReflectionExample {

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

    public static void main(String[] args) {
        // 枚举类型判断
        Class<?> enumClass = Day.class;
        if (enumClass.isEnum()) {
            System.out.println("这是一个枚举类型");
        } else {
            System.out.println("这不是一个枚举类型");
        }
    }
}

6. 反射获取枚举信息

public class EnumReflectionExample {

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

    public static void main(String[] args) {
        // 枚举信息获取
        Class<Day> enumClass = Day.class;
        System.out.println("枚举类的简单名称:" + enumClass.getSimpleName());
        System.out.println("枚举类的全限定名称:" + enumClass.getName());
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • k8s部署的java服务添加idea调试参数的方法

    k8s部署的java服务添加idea调试参数的方法

    文章介绍了如何在K8S容器中的Java服务上进行远程调试,包括配置Deployment、Service以及本地IDEA的调试设置,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • 详解springMVC两种方式实现多文件上传及效率比较

    详解springMVC两种方式实现多文件上传及效率比较

    本篇文章介绍了springMVC两种方式实现多文件上传及效率比较。springMVC实现多文件上传有两种,一种是字节流的方式进行文件上传,另外一种是使用springMVC包装好的解析器进行上传,有兴趣的可以了解一下。
    2016-12-12
  • Java设计模式之策略模式案例详解

    Java设计模式之策略模式案例详解

    策略模式(Strategy Pattern)定义了一组同类型的算法,在不同的类中封装起来,每种算法可以根据当前场景相互替换,从而使算法的变化独立于使用它们的客户端即算法的调用者
    2022-07-07
  • JAVA基础之控制台输入输出的实例代码

    JAVA基础之控制台输入输出的实例代码

    下面小编就为大家带来一篇JAVA基础之控制台输入输出的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • JVM参数NativeMemoryTracking的使用

    JVM参数NativeMemoryTracking的使用

    本文主要介绍了JVM参数NativeMemoryTracking的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • Mybatis 高级用法和tk.mybatis使用示例详解

    Mybatis 高级用法和tk.mybatis使用示例详解

    tkmybatis 是对底层 sql 进行了抽象封装,不需要考虑 sql 怎么写,只需要按照逻辑思维,遵循 tkmybatis 的语法即可实现数据库操作,这篇文章主要介绍了Mybatis 高级用法和tk.mybatis使用,需要的朋友可以参考下
    2024-05-05
  • Java导出Excel动态表头的示例详解

    Java导出Excel动态表头的示例详解

    这篇文章主要为大家详细介绍了Java导出Excel动态表头的相关知识,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下
    2025-02-02
  • 使用IDEA对SpringBoot应用进行远程调试方式

    使用IDEA对SpringBoot应用进行远程调试方式

    文章介绍了如何在IDEA中对部署在服务器上的SpringBoot应用进行远程调试,通过配置远程调试端口和启动参数,本地IDEA可以设置断点并进行调试
    2025-02-02
  • java 获取对象中为null的字段实例代码

    java 获取对象中为null的字段实例代码

    这篇文章主要介绍了java 获取对象中为null的字段实例代码,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Java for循环倒序输出的操作代码

    Java for循环倒序输出的操作代码

    在Java中,要实现一个for循环的倒序输出,通常我们会使用数组或集合(如ArrayList)作为数据源,然后通过倒序遍历这个数组或集合来实现,这篇文章主要介绍了Java for循环倒序输出,需要的朋友可以参考下
    2024-07-07

最新评论