文章目录
- 一、定义方式
- 1.1 简单定义
- 1.2 带参数定义
- 二、反射应用
- 1. 反射获取枚举常量
- 2. 反射获取枚举属性
- 3. 动态调用枚举方法
- 4. 动态设置枚举属性
- 5. 判断枚举类型
- 6. 反射获取枚举信息
-
单例模式:枚举类型是一种有限实例的类,枚举常量在定义时就被限定为一组固定的实例,不能动态添加或修改。每个枚举常量都是枚举类型的实例,因此枚举类型天然地支持单例模式。
-
类型安全:枚举类型是类型安全的,编译器会在编译时检查枚举值的合法性,避免使用无效的枚举常量,在多线程环境下使用枚举类型是线程安全的。
-
不可继承:枚举类型默认是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());}
}