文章目錄
- 一、定義方式
- 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());}
}