Java枚舉的使用與反射應用方式
更新時間:2024年09月23日 15:22:00 作者:夏詩曼CharmaineXia
枚舉類型是一種特殊的類,限定為固定實例集合,且是類型安全和線程安全的,枚舉類型不可繼承,但可以添加屬性和方法,支持單例模式,枚舉常量可以通過反射獲取和操作,提供了靈活性和擴展性
- 單例模式:枚舉類型是一種有限實例的類,枚舉常量在定義時就被限定為一組固定的實例,不能動態(tài)添加或修改。每個枚舉常量都是枚舉類型的實例,因此枚舉類型天然地支持單例模式。
- 類型安全:枚舉類型是類型安全的,編譯器會在編譯時檢查枚舉值的合法性,避免使用無效的枚舉常量,在多線程環(huán)境下使用枚舉類型是線程安全的。
- 不可繼承:枚舉類型默認是final修飾的,不能被繼承,因為枚舉類型已經(jīng)提供了固定的實例集合。
- 可添加屬性和方法:枚舉類型可以擁有字段、方法和構造函數(shù),可以為每個枚舉常量添加屬性和行為。
一、定義方式
Java枚舉是一種特殊的數(shù)據(jù)類型,用于定義一組常量集合,可以定義簡單的枚舉常量,也可以為枚舉常量添加屬性和方法。
1.1 簡單定義
// 定義表示星期的枚舉類型 public enum Weekday { MONDAY, // 星期一 TUESDAY, // 星期二 WEDNESDAY, // 星期三 THURSDAY, // 星期四 FRIDAY, // 星期五 SATURDAY, // 星期六 SUNDAY // 星期日 }
1.2 帶參數(shù)定義
帶參數(shù)定義允許枚舉常量攜帶額外信息,使枚舉更具靈活性。
// 定義表示季節(jié)的枚舉類型,每個季節(jié)攜帶中文名稱 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()方法獲取所有枚舉常量的數(shù)組,方便遍歷枚舉值。
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. 動態(tài)調(diào)用枚舉方法
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) { // 動態(tài)調(diào)用枚舉方法 try { Day monday = Day.valueOf("MONDAY"); monday.sayHello(); } catch (IllegalArgumentException e) { e.printStackTrace(); } } }
4. 動態(tài)設置枚舉屬性
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) { // 動態(tài)設置枚舉屬性 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()); } }
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
關于springboot的接口返回值統(tǒng)一標準格式
這篇文章主要介紹了關于springboot的接口返回值統(tǒng)一標準格式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05通過使用Byte?Buddy便捷創(chuàng)建Java?Agent
這篇文章主要為大家介紹了如何通過使用Byte?Buddy便捷創(chuàng)建Java?Agent的使用說明,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步2022-03-03