Java枚舉的使用與反射應(yīng)用方式
- 單例模式:枚舉類型是一種有限實(shí)例的類,枚舉常量在定義時(shí)就被限定為一組固定的實(shí)例,不能動(dòng)態(tài)添加或修改。每個(gè)枚舉常量都是枚舉類型的實(shí)例,因此枚舉類型天然地支持單例模式。
- 類型安全:枚舉類型是類型安全的,編譯器會(huì)在編譯時(shí)檢查枚舉值的合法性,避免使用無效的枚舉常量,在多線程環(huán)境下使用枚舉類型是線程安全的。
- 不可繼承:枚舉類型默認(rèn)是final修飾的,不能被繼承,因?yàn)槊杜e類型已經(jīng)提供了固定的實(shí)例集合。
- 可添加屬性和方法:枚舉類型可以擁有字段、方法和構(gòu)造函數(shù),可以為每個(gè)枚舉常量添加屬性和行為。
一、定義方式
Java枚舉是一種特殊的數(shù)據(jù)類型,用于定義一組常量集合,可以定義簡(jiǎn)單的枚舉常量,也可以為枚舉常量添加屬性和方法。
1.1 簡(jiǎn)單定義
// 定義表示星期的枚舉類型
public enum Weekday {
MONDAY, // 星期一
TUESDAY, // 星期二
WEDNESDAY, // 星期三
THURSDAY, // 星期四
FRIDAY, // 星期五
SATURDAY, // 星期六
SUNDAY // 星期日
}1.2 帶參數(shù)定義
帶參數(shù)定義允許枚舉常量攜帶額外信息,使枚舉更具靈活性。
// 定義表示季節(jié)的枚舉類型,每個(gè)季節(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;
}二、反射應(yīng)用
1. 反射獲取枚舉常量
public class EnumReflectionExample {
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public static void main(String[] args) {
// 獲取枚舉類對(duì)象
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) {
// 獲取枚舉類對(duì)象
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. 動(dòng)態(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) {
// 動(dòng)態(tài)調(diào)用枚舉方法
try {
Day monday = Day.valueOf("MONDAY");
monday.sayHello();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}4. 動(dòng)態(tài)設(shè)置枚舉屬性
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) {
// 動(dòng)態(tài)設(shè)置枚舉屬性
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("這是一個(gè)枚舉類型");
} else {
System.out.println("這不是一個(gè)枚舉類型");
}
}
}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("枚舉類的簡(jiǎn)單名稱:" + enumClass.getSimpleName());
System.out.println("枚舉類的全限定名稱:" + enumClass.getName());
}
}總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
k8s部署的java服務(wù)添加idea調(diào)試參數(shù)的方法
文章介紹了如何在K8S容器中的Java服務(wù)上進(jìn)行遠(yuǎn)程調(diào)試,包括配置Deployment、Service以及本地IDEA的調(diào)試設(shè)置,感興趣的朋友跟隨小編一起看看吧2025-02-02
詳解springMVC兩種方式實(shí)現(xiàn)多文件上傳及效率比較
本篇文章介紹了springMVC兩種方式實(shí)現(xiàn)多文件上傳及效率比較。springMVC實(shí)現(xiàn)多文件上傳有兩種,一種是字節(jié)流的方式進(jìn)行文件上傳,另外一種是使用springMVC包裝好的解析器進(jìn)行上傳,有興趣的可以了解一下。2016-12-12
JAVA基礎(chǔ)之控制臺(tái)輸入輸出的實(shí)例代碼
下面小編就為大家?guī)硪黄狫AVA基礎(chǔ)之控制臺(tái)輸入輸出的實(shí)例代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-07-07
JVM參數(shù)NativeMemoryTracking的使用
本文主要介紹了JVM參數(shù)NativeMemoryTracking的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Mybatis 高級(jí)用法和tk.mybatis使用示例詳解
tkmybatis 是對(duì)底層 sql 進(jìn)行了抽象封裝,不需要考慮 sql 怎么寫,只需要按照邏輯思維,遵循 tkmybatis 的語法即可實(shí)現(xiàn)數(shù)據(jù)庫操作,這篇文章主要介紹了Mybatis 高級(jí)用法和tk.mybatis使用,需要的朋友可以參考下2024-05-05
Java導(dǎo)出Excel動(dòng)態(tài)表頭的示例詳解
這篇文章主要為大家詳細(xì)介紹了Java導(dǎo)出Excel動(dòng)態(tài)表頭的相關(guān)知識(shí),文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下2025-02-02
使用IDEA對(duì)SpringBoot應(yīng)用進(jìn)行遠(yuǎn)程調(diào)試方式
文章介紹了如何在IDEA中對(duì)部署在服務(wù)器上的SpringBoot應(yīng)用進(jìn)行遠(yuǎn)程調(diào)試,通過配置遠(yuǎn)程調(diào)試端口和啟動(dòng)參數(shù),本地IDEA可以設(shè)置斷點(diǎn)并進(jìn)行調(diào)試2025-02-02
java 獲取對(duì)象中為null的字段實(shí)例代碼
這篇文章主要介紹了java 獲取對(duì)象中為null的字段實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04

