Java?枚舉的常用技巧匯總
一、枚舉的基本概念
1. 什么是枚舉?
枚舉是用來(lái)定義一組常量的類型,通常用于表示一系列固定的值。Java 枚舉是通過(guò) enum
關(guān)鍵字來(lái)定義的,并且每個(gè)枚舉都是 java.lang.Enum
的子類。
2. 基本枚舉示例
public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }
在這個(gè)例子中,Day
枚舉定義了一周中的7天,每個(gè)枚舉值(SUNDAY
、MONDAY
等)都是 Day
類型的常量。
使用示例:
Day today = Day.MONDAY; if (today == Day.MONDAY) { System.out.println("It's the start of the work week!"); }
3. 枚舉的優(yōu)勢(shì)
- 類型安全:枚舉提供了編譯時(shí)的類型檢查,避免了使用字符串或整型常量帶來(lái)的錯(cuò)誤。
- 可讀性:枚舉讓代碼變得更加自描述,明確了具體的業(yè)務(wù)含義。
- 可擴(kuò)展性:枚舉可以定義方法、字段、實(shí)現(xiàn)接口等,非常靈活。
二、枚舉的高級(jí)用法
1. 枚舉中的字段和方法
枚舉不僅僅可以定義常量,還可以包含字段、構(gòu)造函數(shù)和方法。通過(guò)這種方式,枚舉可以存儲(chǔ)更多的相關(guān)信息,并根據(jù)需要執(zhí)行邏輯。
示例:表示一周中的天,包含是否是工作日的信息
public enum Day { SUNDAY(false), MONDAY(true), TUESDAY(true), WEDNESDAY(true), THURSDAY(true), FRIDAY(true), SATURDAY(false); private final boolean isWorkday; // 構(gòu)造函數(shù) Day(boolean isWorkday) { this.isWorkday = isWorkday; } public boolean isWorkday() { return isWorkday; } }
在這個(gè)示例中,我們?yōu)槊恳惶於x了一個(gè)布爾字段 isWorkday
,用來(lái)表示這一天是否是工作日。每個(gè)枚舉常量在定義時(shí)都需要為這個(gè)字段賦值。
使用方法:
Day today = Day.WEDNESDAY; if (today.isWorkday()) { System.out.println(today + " is a workday."); } else { System.out.println(today + " is not a workday."); }
2. 為枚舉添加行為
你可以為每個(gè)枚舉常量定義不同的行為,類似于策略模式。我們可以通過(guò)在枚舉中定義抽象方法,并為每個(gè)枚舉常量提供不同的實(shí)現(xiàn)。
示例:不同支付方式的手續(xù)費(fèi)計(jì)算
public enum PaymentMethod { CREDIT_CARD { @Override public double calculateFee(double amount) { return amount * 0.02; // 2% 手續(xù)費(fèi) } }, DEBIT_CARD { @Override public double calculateFee(double amount) { return amount * 0.01; // 1% 手續(xù)費(fèi) } }, PAYPAL { @Override public double calculateFee(double amount) { return amount * 0.03; // 3% 手續(xù)費(fèi) } }; // 抽象方法,每個(gè)枚舉常量都需要實(shí)現(xiàn) public abstract double calculateFee(double amount); }
使用方法:
double amount = 1000.0; PaymentMethod method = PaymentMethod.CREDIT_CARD; double fee = method.calculateFee(amount); System.out.println("Payment method: " + method + ", Fee: " + fee);
在這個(gè)例子中,每種支付方式都有自己特定的手續(xù)費(fèi)計(jì)算規(guī)則,且通過(guò)枚舉實(shí)現(xiàn)了不同的行為邏輯。
3. 枚舉實(shí)現(xiàn)接口
枚舉不僅可以包含方法,還可以實(shí)現(xiàn)接口。這使得枚舉更加靈活,可以用于一些面向接口編程的場(chǎng)景中。
示例:用枚舉實(shí)現(xiàn)簡(jiǎn)單的命令模式
public interface Command { void execute(); } public enum SimpleCommand implements Command { START { @Override public void execute() { System.out.println("Starting..."); } }, STOP { @Override public void execute() { System.out.println("Stopping..."); } }, RESTART { @Override public void execute() { System.out.println("Restarting..."); } } }
使用方法:
SimpleCommand command = SimpleCommand.START; command.execute();
在這里,SimpleCommand
枚舉實(shí)現(xiàn)了 Command
接口,并為每個(gè)命令提供了不同的實(shí)現(xiàn)。這種設(shè)計(jì)非常適合有多種狀態(tài)或命令的場(chǎng)景。
4. 覆蓋 toString() 方法
枚舉的默認(rèn) toString()
方法會(huì)返回常量的名字,有時(shí)我們需要自定義輸出結(jié)果,可以覆蓋 toString()
方法。
示例:自定義枚舉的顯示內(nèi)容
public enum Day { SUNDAY("Sunday"), MONDAY("Monday"), TUESDAY("Tuesday"), WEDNESDAY("Wednesday"), THURSDAY("Thursday"), FRIDAY("Friday"), SATURDAY("Saturday"); private final String displayName; Day(String displayName) { this.displayName = displayName; } @Override public String toString() { return displayName; } }
使用時(shí):
System.out.println(Day.MONDAY); // 輸出: Monday
通過(guò)覆蓋 toString()
方法,我們可以自定義每個(gè)枚舉常量的輸出格式。
三、枚舉結(jié)合 switch 語(yǔ)句
在 Java 中,switch
語(yǔ)句從 1.5 版本開(kāi)始支持枚舉類型,這使得處理枚舉更加簡(jiǎn)潔。
示例:基于枚舉類型進(jìn)行條件分支處理
public class EnumSwitchExample { public static void main(String[] args) { Day today = Day.FRIDAY; switch (today) { case MONDAY: System.out.println("Back to work!"); break; case FRIDAY: System.out.println("Almost weekend!"); break; case SUNDAY: System.out.println("Rest and relax!"); break; default: System.out.println("Just another day."); break; } } }
在這種情況下,使用 switch
語(yǔ)句可以更加清晰和簡(jiǎn)潔地處理枚舉的不同值。
四、枚舉的序列化和線程安全
Java 中的枚舉是單例的,意味著每個(gè)枚舉常量在 JVM 中只有一個(gè)實(shí)例,因此它們本質(zhì)上是線程安全的。即使在序列化時(shí),Java 枚舉仍然是單例的,因?yàn)樵诜葱蛄谢^(guò)程中,Java 會(huì)確保返回相同的枚舉實(shí)例。
示例:枚舉作為單例模式
public enum SingletonEnum { INSTANCE; public void doSomething() { System.out.println("Singleton doing something..."); } }
使用方法:
SingletonEnum singleton = SingletonEnum.INSTANCE; singleton.doSomething();
通過(guò)枚舉實(shí)現(xiàn)單例模式,不僅代碼簡(jiǎn)潔,還保證了序列化的安全性。
五、總結(jié)
Java 枚舉不僅僅是定義一組常量的工具,它還可以用來(lái)存儲(chǔ)數(shù)據(jù)、實(shí)現(xiàn)方法、擴(kuò)展行為,甚至可以用于實(shí)現(xiàn)設(shè)計(jì)模式。枚舉的高級(jí)用法讓我們能夠?qū)懗龈忧逦?、可維護(hù)和靈活的代碼。
總結(jié)為以下幾點(diǎn):
- 基本使用:枚舉是定義常量的最佳工具,確保類型安全。
- 高級(jí)用法:通過(guò)字段、方法和構(gòu)造函數(shù),使枚舉更加靈活。
- 實(shí)現(xiàn)接口與抽象方法:可以讓枚舉支持不同的行為邏輯。
- 結(jié)合 switch:方便條件判斷,代碼更簡(jiǎn)潔。
- 線程安全與單例模式:枚舉的單例特性確保了線程安全和序列化安全。
枚舉不僅是“常量集合”,也是 Java 世界中極具表現(xiàn)力的工具。
到此這篇關(guān)于Java 枚舉的常用技巧匯總的文章就介紹到這了,更多相關(guān)Java 枚舉使用技巧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中的FilterOutputStream 簡(jiǎn)介_(kāi)動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
FilterOutputStream 的作用是用來(lái)“封裝其它的輸出流,并為它們提供額外的功能”。它主要包括BufferedOutputStream, DataOutputStream和PrintStream。接下來(lái)通過(guò)本文給大家簡(jiǎn)單介紹下FilterOutputStream知識(shí),需要的朋友參考下吧2017-05-05詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換
這篇文章主要介紹了詳解PowerDesigner之CDM、PDM、SQL之間轉(zhuǎn)換的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10Idea 自動(dòng)生成測(cè)試的實(shí)現(xiàn)步驟
當(dāng)我們?cè)趯?xiě)完一些接口方法后需要測(cè)試時(shí),一個(gè)一個(gè)新建測(cè)試類比較麻煩 idea給我們提供了快捷辦法,本文主要介紹了Idea 自動(dòng)生成測(cè)試的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05使用lombok的@Data會(huì)導(dǎo)致棧溢出StackOverflowError問(wèn)題
這篇文章主要介紹了使用lombok的@Data會(huì)導(dǎo)致棧溢出StackOverflowError問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11詳解如何配置Spring Batch批處理失敗重試機(jī)制
這篇文章主要來(lái)和大家一起探討一下如何在Spring批處理框架中配置重試邏輯,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06Spring @Cacheable redis異常不影響正常業(yè)務(wù)方案
這篇文章主要介紹了Spring @Cacheable redis異常不影響正常業(yè)務(wù)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02java中l(wèi)ambda(函數(shù)式編程)一行解決foreach循環(huán)問(wèn)題
這篇文章主要介紹了java中l(wèi)ambda(函數(shù)式編程)一行解決foreach循環(huán)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07springboot中EasyPoi實(shí)現(xiàn)自動(dòng)新增序號(hào)的方法
本文主要介紹了EasyPoi實(shí)現(xiàn)自動(dòng)新增序號(hào),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09