一文了解Java中枚舉的使用
概述
Java中枚舉,大家在項(xiàng)目中經(jīng)常使用吧,主要用來(lái)定義一些固定值,在一個(gè)有限的集合內(nèi),比如在表示一周的某一天,一年中的四季等。那你了解枚舉的本質(zhì)嗎?了解枚舉的一些常見(jiàn)用法嗎?
枚舉介紹和使用
枚舉主要用來(lái)定義一個(gè)有限集合內(nèi)的固定值。
枚舉定義方式如下:
// 簡(jiǎn)單的定義 enum WeekEnum { MONDAY, TUESDAY } // 有屬性的定義 enum StatusEnum { ENABLE("1", "啟用"), DISABLE("0", "禁用"); private String code; private String name; StatusEnum(String code, String name) { this.code = code; this.name = name; } }
枚舉編譯后實(shí)際上繼承了java.lang.Enum這個(gè)類,后面詳細(xì)講解,我們看下這個(gè)類的關(guān)鍵方法:
static Enum valueOf(Class enumClass, String name)
返回指定名字、給定類的枚舉常量
String toString()
返回枚舉常量名
int ordinal()
返回枚舉常量在enum中的位置,從0開(kāi)始
int compareTo(E other)
如果枚舉場(chǎng)景出現(xiàn)在other之前,則返回一個(gè)負(fù)值,如果this == other,則返回0,否則返回正值。
public static void main(String[] args) { // 根據(jù)字符串獲取枚舉 StatusEnum enable = Enum.valueOf(StatusEnum.class, "ENABLE"); System.out.println(enable); //枚舉比較直接用== System.out.println(enable == StatusEnum.ENABLE); // values方法獲取所有的枚舉 StatusEnum[] values = StatusEnum.values(); for (StatusEnum statusEnum : values) { // 打印枚舉的位置 System.out.println(statusEnum.ordinal()); } }
運(yùn)行結(jié)果:
枚舉的本質(zhì)
枚舉的本質(zhì)其實(shí)一個(gè)類,繼承了java.lang.Enum這個(gè)類。我們可以用idea的插件看下生成的字節(jié)碼如下:
繼承了java.lang.Enum
ENABLE、DISABLE最終轉(zhuǎn)換為靜態(tài)字段,類型其實(shí)StatusEnum這個(gè)類
類加載的時(shí)候初始化ENABLE、DISABLE這兩個(gè)屬性。
方法是類加載的初始化階段就是執(zhí)行的,它這里的主要邏輯就是創(chuàng)建了兩個(gè)對(duì)象,設(shè)置到ENABLE,DISABLE上。
這下你明白枚舉是怎么一會(huì)事情了吧。
枚舉常見(jiàn)用途
枚舉創(chuàng)建單例
枚舉可以作為單例模式的最佳方式,能夠保證單例對(duì)象的唯一性。
public class User { //私有化構(gòu)造函數(shù) private User(){ } //定義一個(gè)靜態(tài)枚舉類 static enum SingletonEnum{ //創(chuàng)建一個(gè)枚舉對(duì)象,該對(duì)象天生為單例 INSTANCE; private User user; //私有化枚舉的構(gòu)造函數(shù) private SingletonEnum(){ user = new User(); } public User getInstnce(){ return user; } } //對(duì)外暴露一個(gè)獲取User對(duì)象的靜態(tài)方法 public static User getInstance(){ return SingletonEnum.INSTANCE.getInstnce(); } }
枚舉INSTANCE會(huì)在類加載初始化的時(shí)候創(chuàng)建,而Java類的加載和初始化過(guò)程都是線程安全的。
枚舉可避免反序列化破壞單例。
枚舉抽象方法
枚舉類可以定義抽象方法,然后讓各個(gè)具體的枚舉實(shí)現(xiàn),可以通過(guò)枚舉實(shí)現(xiàn)不同的策略實(shí)現(xiàn)。
enum OperEnum { ADD(1, 2) { @Override public Integer operate() { return this.getA() + this.getB(); } }, MULTIPY(1, 2) { @Override public Integer operate() { return this.getA() * this.getB(); } }; private Integer a; private Integer b; OperEnum(Integer a, Integer b) { this.a = a; this.b = b; } public abstract Integer operate(); public Integer getA() { return a; } public void setA(Integer a) { this.a = a; } public Integer getB() { return b; } public void setB(Integer b) { this.b = b; } }
到此這篇關(guān)于一文了解Java中枚舉的使用的文章就介紹到這了,更多相關(guān)Java枚舉內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java 使用openoffice進(jìn)行word轉(zhuǎn)換為pdf的方法步驟
這篇文章主要介紹了Java 使用openoffice進(jìn)行word轉(zhuǎn)換為pdf的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Redis實(shí)現(xiàn)延遲隊(duì)列的全流程詳解
Redisson是Redis服務(wù)器上的分布式可伸縮Java數(shù)據(jù)結(jié)構(gòu),這篇文中主要為大家介紹了Redisson實(shí)現(xiàn)的優(yōu)雅的延遲隊(duì)列的方法,需要的可以參考一下2023-03-03如何通過(guò)一張圖搞懂springBoot自動(dòng)注入原理
這篇文章主要給大家介紹了關(guān)于如何通過(guò)一張圖搞懂springBoot自動(dòng)注入原理的相關(guān)資料,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02ScheduledExecutorService任務(wù)定時(shí)代碼示例
這篇文章主要介紹了ScheduledExecutorService任務(wù)定時(shí)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01快速解決VS Code報(bào)錯(cuò):Java 11 or more recent is required to run. Ple
這篇文章主要介紹了快速解決VS Code報(bào)錯(cuò):Java 11 or more recent is required to run. Please download and install a recent JDK的相關(guān)資料,需要的朋友可以參考下2020-09-09Java隨機(jī)數(shù)算法原理與實(shí)現(xiàn)方法實(shí)例詳解
這篇文章主要介紹了Java隨機(jī)數(shù)算法原理與實(shí)現(xiàn)方法,簡(jiǎn)單分析了隨機(jī)數(shù)算法的原理并結(jié)合具體實(shí)例形式給出了java編程計(jì)算隨機(jī)數(shù)的具體操作技巧,需要的朋友可以參考下2017-09-09