一文了解Java中枚舉的使用
概述
Java中枚舉,大家在項目中經(jīng)常使用吧,主要用來定義一些固定值,在一個有限的集合內(nèi),比如在表示一周的某一天,一年中的四季等。那你了解枚舉的本質(zhì)嗎?了解枚舉的一些常見用法嗎?
枚舉介紹和使用
枚舉主要用來定義一個有限集合內(nèi)的固定值。
枚舉定義方式如下:
// 簡單的定義
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;
}
}枚舉編譯后實際上繼承了java.lang.Enum這個類,后面詳細(xì)講解,我們看下這個類的關(guān)鍵方法:
static Enum valueOf(Class enumClass, String name)
返回指定名字、給定類的枚舉常量
String toString()
返回枚舉常量名
int ordinal()
返回枚舉常量在enum中的位置,從0開始
int compareTo(E other)
如果枚舉場景出現(xiàn)在other之前,則返回一個負(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ì)其實一個類,繼承了java.lang.Enum這個類。我們可以用idea的插件看下生成的字節(jié)碼如下:
繼承了java.lang.Enum

ENABLE、DISABLE最終轉(zhuǎn)換為靜態(tài)字段,類型其實StatusEnum這個類

類加載的時候初始化ENABLE、DISABLE這兩個屬性。

方法是類加載的初始化階段就是執(zhí)行的,它這里的主要邏輯就是創(chuàng)建了兩個對象,設(shè)置到ENABLE,DISABLE上。
這下你明白枚舉是怎么一會事情了吧。
枚舉常見用途
枚舉創(chuàng)建單例
枚舉可以作為單例模式的最佳方式,能夠保證單例對象的唯一性。
public class User {
//私有化構(gòu)造函數(shù)
private User(){ }
//定義一個靜態(tài)枚舉類
static enum SingletonEnum{
//創(chuàng)建一個枚舉對象,該對象天生為單例
INSTANCE;
private User user;
//私有化枚舉的構(gòu)造函數(shù)
private SingletonEnum(){
user = new User();
}
public User getInstnce(){
return user;
}
}
//對外暴露一個獲取User對象的靜態(tài)方法
public static User getInstance(){
return SingletonEnum.INSTANCE.getInstnce();
}
}枚舉INSTANCE會在類加載初始化的時候創(chuàng)建,而Java類的加載和初始化過程都是線程安全的。
枚舉可避免反序列化破壞單例。
枚舉抽象方法
枚舉類可以定義抽象方法,然后讓各個具體的枚舉實現(xiàn),可以通過枚舉實現(xiàn)不同的策略實現(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+MybatisPlus+Mysql+JSP實戰(zhàn)
這篇文章主要介紹了SpringBoot+MybatisPlus+Mysql+JSP實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java如何向主函數(shù)main中傳入?yún)?shù)
這篇文章主要介紹了Java如何向主函數(shù)main中傳入?yún)?shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
學(xué)習(xí)Java的static與final關(guān)鍵字
本篇文章給大家詳細(xì)分析了Java的static與final關(guān)鍵字知識點以及相關(guān)代碼分享,有需要的讀者跟著學(xué)習(xí)下吧。2018-03-03
分布式難題ElasticSearch解決大數(shù)據(jù)量檢索面試
這篇文章主要為大家介紹了分布式面試難題,ElasticSearch解決大數(shù)據(jù)量檢索的問題分析回答,讓面試官無話可說,幫助大家實現(xiàn)面試開薪自由2022-03-03
Java中替代equals,compareTo和toString的方法
這篇文章主要介紹了Java中替代equals,compareTo和toString的方法,文中代碼十分詳細(xì),幫助大家更好的理解的學(xué)習(xí),感興趣的朋友可以了解下2020-06-06
簡單談?wù)凧ava遍歷樹深度優(yōu)先和廣度優(yōu)先的操作方式
這篇文章主要介紹了簡單談?wù)凧ava遍歷樹深度優(yōu)先和廣度優(yōu)先的操作方式的相關(guān)資料,需要的朋友可以參考下2023-03-03

