概述
Java中的枚舉,大家在項目中經常使用吧,主要用來定義一些固定值,在一個有限的集合內,比如在表示一周的某一天,一年中的四季等。那你了解枚舉的本質嗎,或者說底層是什么樣的?了解枚舉的一些神仙用法嗎?
枚舉介紹和使用
枚舉主要用來定義一個有限集合內的固定值。
枚舉定義方式如下:
// 簡單的定義
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這個類,后面詳細講解,我們看下這個類的關鍵方法:
- static Enum valueOf(Class enumClass, String name)
返回指定名字、給定類的枚舉常量
- String toString()
返回枚舉常量名
- int ordinal()
返回枚舉常量在enum中的位置,從0開始
- int compareTo(E other)
如果枚舉場景出現在other之前,則返回一個負值,如果this == other,則返回0,否則返回正值。
public static void main(String[] args) {
// 根據字符串獲取枚舉
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());
}
}
運行結果:

枚舉的本質
枚舉的本質其實是一個類,繼承了java.lang.Enum這個類。我們可以用idea的插件看下生成的字節碼如下:
- 繼承了java.lang.Enum

- ENABLE、DISABLE最終轉換為靜態字段,類型其實StatusEnum這個類

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

方法是類加載的初始化階段就是執行的,它這里的主要邏輯就是創建了兩個對象,設置到ENABLE,DISABLE上。
這下你明白枚舉是怎么一會事情了吧。
枚舉常見用途
枚舉創建單例
枚舉可以作為單例模式的最佳方式,能夠保證單例對象的唯一性。
public class User {
//私有化構造函數
private User(){ }
//定義一個靜態枚舉類
static enum SingletonEnum{
//創建一個枚舉對象,該對象天生為單例
INSTANCE;
private User user;
//私有化枚舉的構造函數
private SingletonEnum(){
user = new User();
}
public User getInstnce(){
return user;
}
}
//對外暴露一個獲取User對象的靜態方法
public static User getInstance(){
return SingletonEnum.INSTANCE.getInstnce();
}
}
- 枚舉INSTANCE會在類加載初始化的時候創建,而Java類的加載和初始化過程都是線程安全的。
- 枚舉可避免反序列化破壞單例。
枚舉抽象方法
枚舉類可以定義抽象方法,然后讓各個具體的枚舉實現,可以通過枚舉實現不同的策略實現。
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;
}
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
JAVA
+關注
關注
20文章
3001瀏覽量
116419 -
JAVA語言
+關注
關注
0文章
138瀏覽量
21528
發布評論請先 登錄
相關推薦
熱點推薦
C語言中枚舉的基本概念和常見用法
在C語言中,枚舉是一種方便組織和表示一組相關常量的工具。枚舉類型有助于提高代碼的可讀性和可維護性。本文將介紹C語言枚舉的基本概念、語法和用法,以及一些高級技巧。
發表于 08-17 15:32
?2839次閱讀
Java多線程的用法
本文將介紹一下Java多線程的用法。 基礎介紹 什么是多線程 指的是在一個進程中同時運行多個線程,每個線程都可以獨立執行不同的任務或操作。 與單線程相比,多線程可以提高程序的并發性和響應
智能五筆:另類用法技巧你知道嗎?
智能五筆:另類用法技巧你知道嗎?
智能五筆是很多朋友都喜歡使用的一種五筆輸入法,不過如果你只是將其作為一款普通的輸入法來使用的話,那
發表于 02-24 13:49
?1068次閱讀
深入理解java枚舉類型enum用法
enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。 下面是我在使用 enum 過程中的一些經驗和總結。 原始的接口定義
發表于 09-27 11:49
?0次下載
java并發編程實戰之輔助類用法
Java并發編程:CountDownLatch、CyclicBarrier和Semaphore2017-09-18 13:07程序設計/58 在java 1.5中,提供了一些非常有用的輔助類來幫助
發表于 09-27 16:50
?0次下載
go語言枚舉類型怎么用
、 java 等,都有原生支持。在 go 中,大家卻找不到 enum 或者其它直接用來聲明枚舉類型的關鍵字。從熟悉其它編程語言的開發者轉用 go 編程,剛開始會比較難接受這種情況。其實,如果你
SystemVerilog中枚舉類型的使用建議
SystemVerilog中枚舉類型雖然屬于一種“強類型”,但是枚舉類型還是提供了一些“不正經”的用法可以實現一些很常見的功能,本文將示例一些在枚舉
如何正確區分Java中super函數用法
Java中super函數有很多方法,在使用的時候我們應該如何正確區分?
2 方法
三種用法:
訪問父類的方法。
調用父類構造方法。
訪問父類中的隱藏成員變
Java枚舉的特點及用法
在 Java 枚舉出現之前,通常會使用常量類來表示一組固定的常量值,直到Java 1.5之后推出了枚舉,那么枚舉類型有哪些特點,它比常量類又
java中obj類型的實戰用法
類型具有許多實戰用法,下面將詳細介紹一些常見的使用場景。 作為方法參數和返回值的類型 在Java中,可以使用obj類型作為方法的參數或返回值類型。這種用法可以使方法具有更廣泛的適用性,
Java 枚舉與策略模式、函數式接口的結合:實現高內聚低耦合的設計
作者:京東物流 楊唯一 一、Java 枚舉類 Java 枚舉是一個特殊的類,一般表示一組常量,比如一年的 4 個季節,一年的 12 個月份,一個星期的 7 天,方向有東南西北等。 我們
你知道Java中枚舉的這些神仙用法嗎?
評論