詳細講解一下Java中的Enum

Java 中的 枚舉(Enum) 是一種特殊的類,用于表示一組固定且有限的常量(如狀態、類型、選項等)。它提供類型安全的常量定義,比傳統的常量(如 public static final)更強大和靈活。以下是 Java 枚舉的詳細講解:


一、枚舉的基本語法

public enum Season {SPRING, SUMMER, AUTUMN, WINTER; // 常量必須放在最前面
}
底層實現:
  • 枚舉本質是繼承自 java.lang.Enum 的類,每個枚舉常量都是該類的實例(單例)。
  • 編譯器會自動生成 values()valueOf(String) 方法。

二、枚舉的核心特性

1. 類型安全
  • 枚舉常量是類型明確的,不能隨意賦值其他類型。
Season currentSeason = Season.SPRING; // 只能賦值 Season 的常量
2. 固定常量集合
  • 枚舉的常量在定義時確定,無法運行時動態修改。
3. 可附加屬性和方法
  • 枚舉可以定義字段、構造函數和方法,實現更復雜的邏輯:
public enum Planet {MERCURY(3.303e+23, 2.4397e6),VENUS(4.869e+24, 6.0518e6);private final double mass;   // 屬性private final double radius; Planet(double mass, double radius) { // 構造函數(默認 private)this.mass = mass;this.radius = radius;}public double surfaceGravity() { // 方法return mass / (radius * radius);}
}
4. 可實現接口
  • 枚舉可以實現接口,但無法繼承其他類(因為已經隱式繼承 Enum)。
public interface Printable {void print();
}public enum Color implements Printable {RED {public void print() { System.out.println("紅色"); }},GREEN {public void print() { System.out.println("綠色"); }};
}

三、枚舉的常用方法

1. 內置方法
  • values():返回枚舉所有常量的數組。
  • valueOf(String name):根據名稱返回對應的枚舉常量。
  • name():返回枚舉常量的名稱(字符串形式)。
  • ordinal():返回枚舉常量的聲明順序(從 0 開始)。
2. 示例代碼
Season[] seasons = Season.values(); // 獲取所有枚舉值
Season s = Season.valueOf("SPRING"); // 根據名稱獲取枚舉
System.out.println(s.name());        // 輸出 "SPRING"
System.out.println(s.ordinal());     // 輸出 0

四、枚舉的高級用法

1. 枚舉與單例模式
  • 枚舉是實現線程安全單例的最佳方式(防止反射攻擊和序列化問題):
public enum Singleton {INSTANCE;public void doSomething() {// 業務邏輯}
}
2. 枚舉作為狀態機
  • 通過枚舉的屬性和方法,可以優雅地實現狀態流轉:
public enum OrderStatus {NEW {public OrderStatus next() { return PAID; }},PAID {public OrderStatus next() { return SHIPPED; }},SHIPPED {public OrderStatus next() { return COMPLETED; }},COMPLETED {public OrderStatus next() { return this; }};public abstract OrderStatus next();
}
3. 策略模式
  • 通過枚舉實現不同的策略行為:
public enum Operation {ADD { public int apply(int a, int b) { return a + b; } },SUB { public int apply(int a, int b) { return a - b; } };public abstract int apply(int a, int b);
}

五、枚舉的注意事項

  1. 構造函數私有化
    枚舉的構造函數默認是 private,不能手動修改為 publicprotected

  2. 常量定義位置
    枚舉常量必須定義在類的第一行,之后才能定義字段和方法。

  3. 性能與內存
    枚舉比常量占用更多內存(每個常量是一個對象實例),但在大多數場景下影響可忽略。

  4. 序列化
    枚舉的序列化僅存儲名稱,反序列化時通過 valueOf 恢復,天然安全。


六、枚舉 vs 常量類

特性枚舉常量類(public static final)
類型安全?? 編譯時檢查類型? 只是 int/String 常量
可附加方法?? 支持方法和屬性? 只能定義簡單值
擴展性? 常量固定?? 可隨意添加新常量(但破壞封裝)
線程安全?? 實例天然單例且不可變? 需手動控制

七、總結

使用枚舉的場景

  • 需要一組固定的、類型安全的常量(如狀態、錯誤碼、配置選項)。
  • 需要為常量附加行為或數據(如計算、狀態流轉)。
  • 實現單例或策略模式。

避免枚舉的場景

  • 需要動態生成常量(如從數據庫加載)。
  • 對內存極度敏感(如嵌入式開發)。

枚舉是 Java 中一種強大的工具,合理使用可以大幅提升代碼的可讀性和健壯性。
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77249.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77249.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77249.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

首席人工智能官(Chief Artificial Intelligence Officer,CAIO)的詳細解析

以下是**首席人工智能官(Chief Artificial Intelligence Officer,CAIO)**的詳細解析: 1. 職責與核心職能 制定AI戰略 制定公司AI技術的長期戰略,明確AI在業務中的應用場景和優先級,推動AI與核心業務的深度…

LeetCode【劍指offer】系列(位運算篇)

劍指offer15.二進制中1的個數 題目鏈接 題目:編寫一個函數,輸入是一個無符號整數(以二進制串的形式),返回其二進制表達式中數字位數為 ‘1’ 的個數(也被稱為 漢明重量).)。 思路一&#xff…

前端路由緩存實現

場景:以一體化為例:目前頁面涉及頁簽和大量菜單路由,用戶想要實現頁面緩存,即列表頁、詳情頁甚至是編輯彈框頁都要實現數據緩存。 方案:使用router-view的keep-alive實現 。 一、實現思路 1.需求梳理 需要緩存模塊&…

Buildroot編譯過程中下載源碼失敗

RK3588編譯編譯一下recovery,需要把buildroot源碼編譯一遍。遇到好幾個文件都下載失敗,如下所示 pm-utils 1.4.1這個包下載失敗,下載地址http://pm-utils.freedesktop.org/releases 解決辦法,換個網絡用windows瀏覽器下載后&…

Operator 開發入門系列(一):Hello World

背景 我們公司最近計劃將產品遷移到 Kubernetes 環境。 為了更好地管理和自動化我們的應用程序,我們決定使用 Kubernetes Operator。 本系列博客將記錄我們學習和開發 Operator 的過程,希望能幫助更多的人入門 Operator 開發。 目標讀者 對 Kubernete…

Java基礎知識面試題(已整理Java面試寶典pdf版)

什么是Java Java是一門面向對象編程語言,不僅吸收了C語言的各種優點,還摒棄了C里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論…

科學視角下的打坐:身心獲益的實證探究

在快節奏的現代生活中,人們在追求物質豐富的同時,也愈發關注身心的健康與平衡。古老的打坐修行方式,正逐漸走進科學研究的視野,并以大量實證數據展現出對人體多方面的積極影響。? 什么是打坐: 打坐是一種養生健身法…

javaSE————網絡編程套接字

網絡編程套接字~~~~~ 好久沒更新啦,藍橋杯爆掉了,從今天開始爆更嗷; 1,網絡編程基礎 為啥要有網絡編程呢,我們進行網絡通信就是為了獲取豐富的網絡資源,說實話真的很神奇,想想我們躺在床上&a…

MySQL性能調優(三):MySQL中的系統庫(mysql系統庫)

文章目錄 MySQL性能調優數據庫設計優化查詢優化配置參數調整硬件優化 MySQL中的系統庫1.5.Mysql中mysql系統庫1.5.1.權限系統表1.5.2.統計信息表1.5.2.1.innodb_table_stats1.5.2.2.innodb_index_stats 1.5.3.日志記錄表1.5.3.1. general_log1.5.3.2. slow_log 1.5.4.InnoDB中的…

多個路由器互通(靜態路由)無單臂路由(簡單版)

多個路由器互通(靜態路由)無單臂路由(簡單版) 開啟端口并配ip地址 維護1 Router>en Router#conf t Router(config)#int g0/0 Router(config-if)#no shutdown Router(config-if)#ip address 192.168.10.254 255.255.255.0 Ro…

關于 AI驅動的智慧家居、智慧城市、智慧交通、智慧醫療和智慧生活 的詳細解析,涵蓋其定義、核心技術、應用場景、典型案例及未來趨勢

以下是關于 AI驅動的智慧家居、智慧城市、智慧交通、智慧醫療和智慧生活 的詳細解析,涵蓋其定義、核心技術、應用場景、典型案例及未來趨勢: 一、AI智慧家居 1. 定義與核心功能 定義:通過AI與物聯網(IoT)技術&#…

【ESP32|音頻】一文讀懂WAV音頻文件格式【詳解】

簡介 最近在學習I2S音頻相關內容,無可避免會涉及到關于音頻格式的內容,所以剛開始接觸的時候有點一頭霧水,后面了解了下WAV相關內容,大致能夠看懂wav音頻格式是怎么樣的了。本文主要為后面ESP32 I2S音頻系列文章做鋪墊&#xff0…

端側大模型綜述On-Device Language Models: A Comprehensive Review

此為機器翻譯,僅做個人學習使用 設備端語言模型:全面回顧 DOI:10.48550/arXiv.2409.00088 1 摘要 大型語言模型 (LLM) 的出現徹底改變了自然語言處理應用程序,由于減少延遲、數據本地化和個性化用戶體驗…

推流265視頻,網頁如何支持顯示265的webrtc

科技發展真快,以前在網頁上(一般指谷歌瀏覽器),要顯示265的視頻流,都是很雞肋的辦法,要么轉碼,要么用很慢的hls,體驗非常不好,而今谷歌官方最新的瀏覽器已經支持265的web…

redis的sorted set的應用場景

Redis 的 Sorted Set(有序集合,簡稱 ZSet) 結合了 Set 的去重特性 和 按分數(score)排序 的特性,非常適合需要 高效排序 或 范圍查詢 的場景。以下是它的典型應用場景及示例: 實時排行榜 場景&…

18-21源碼剖析——Mybatis整體架構設計、核心組件調用關系、源碼環境搭建

學習視頻資料來源:https://www.bilibili.com/video/BV1R14y1W7yS 文章目錄 1. 架構設計2. 核心組件及調用關系3. 源碼環境搭建3.1 測試類3.2 實體類3.3 核心配置文件3.4 映射配置文件3.5 遇到的問題 1. 架構設計 Mybatis整體架構分為4層: 接口層&#…

未啟用CUDA支持的PyTorch環境** 中使用GPU加速解決方案

1. 錯誤原因分析 根本問題:當前安裝的PyTorch是CPU版本,無法調用GPU硬件加速。當運行以下代碼時會報錯:model YOLO("yolov8n.pt").to("cuda") # 或 .cuda()2. 解決方案步驟 步驟1:驗證CUDA可用性 在Pyth…

JVM-基于Hotspot

前言 Java虛擬機(Java Virtual Machine簡稱JVM)是運行所有Java程序的抽象計算機,是Java語言的運行環境,其主要任務為將字節碼裝載到內部,解釋/編譯為對應平臺上的機器指令執行。 Java虛擬機規范定義了一個抽象的——…

智能合約安全審計平臺——可視化智能合約漏洞掃描

目錄 可視化智能合約漏洞掃描 —— 理論、實踐與安全保障1. 引言2. 理論背景與漏洞原理2.1 智能合約簡介2.2 常見漏洞類型2.3 漏洞掃描與安全評估原理3. 系統架構與工作流程3.1 系統總體架構3.2 模塊說明4. 漏洞掃描流程詳解4.1 代碼上傳與靜態解析4.2 漏洞模式檢測4.3 風險評估…

【MySQL數據庫】數據類型詳解

目錄 數據類型tinyint類型(整形)bit類型小數浮點數 float、doubledecimal 字符串類型charvarcharchar與varchar的比較 日期時間類型enum和set總結 數據類型 tinyint類型(整形) 例: mysql> create table tt1(num tinyint);mysql> insert into tt1 values(1)…