当前位置: 代码网 > it编程>编程语言>Java > Java枚举的使用与反射应用方式

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

2024年09月23日 Java 我要评论
单例模式:枚举类型是一种有限实例的类,枚举常量在定义时就被限定为一组固定的实例,不能动态添加或修改。每个枚举常量都是枚举类型的实例,因此枚举类型天然地支持单例模式。类型安全:枚举类型是类型安全的,编译
  • 单例模式:枚举类型是一种有限实例的类,枚举常量在定义时就被限定为一组固定的实例,不能动态添加或修改。每个枚举常量都是枚举类型的实例,因此枚举类型天然地支持单例模式。
  • 类型安全:枚举类型是类型安全的,编译器会在编译时检查枚举值的合法性,避免使用无效的枚举常量,在多线程环境下使用枚举类型是线程安全的。
  • 不可继承:枚举类型默认是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());
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com