Java 枚舉(Enum)的使用說明

在 Java 中,枚舉(Enum)是一種特殊的數據類型,用于定義一組固定的命名常量。它比傳統的常量(如?public static final)更安全、更靈活,且支持面向對象特性。以下是枚舉的詳細用法:


1. 基礎定義與使用

java

復制

下載

public enum Direction {NORTH, SOUTH, EAST, WEST  // 枚舉常量(全大寫命名)
}// 使用示例
Direction dir = Direction.NORTH;
System.out.println(dir); // 輸出: NORTH

2. 添加成員變量和方法

枚舉可以有字段、構造方法和自定義方法:

java

復制

下載

public enum Planet {// 枚舉常量 + 構造參數MERCURY(3.303e23, 2.4397e6),VENUS(4.869e24, 6.0518e6);private final double mass;   // 質量(kg)private final double radius; // 半徑(m)// 構造方法(必須是 private)Planet(double mass, double radius) {this.mass = mass;this.radius = radius;}// 自定義方法public double surfaceGravity() {return 6.67430e-11 * mass / (radius * radius);}
}// 使用
double gravity = Planet.MERCURY.surfaceGravity();

3. 覆蓋枚舉常量的方法

每個常量可以有自己的方法實現:

java

復制

下載

public enum Operation {ADD {public double apply(double x, double y) { return x + y; }},SUBTRACT {public double apply(double x, double y) { return x - y; }};public abstract double apply(double x, double y); // 抽象方法
}// 使用
double result = Operation.ADD.apply(5, 3); // 返回 8

4. 常用內置方法

  • values():獲取所有枚舉值

  • valueOf(String name):通過名稱獲取枚舉常量

  • name()?和?ordinal():獲取常量名和順序位置

java

復制

下載

Direction[] allDirections = Direction.values(); // [NORTH, SOUTH, EAST, WEST]
Direction east = Direction.valueOf("EAST");    // 字符串轉枚舉
System.out.println(east.name());     // 輸出 "EAST"
System.out.println(east.ordinal());  // 輸出 2(索引從0開始)

5. 實現接口

枚舉可以實現接口,統一或分別實現方法:

java

復制

下載

public interface Command {void execute();
}public enum FileOperation implements Command {OPEN {public void execute() { System.out.println("打開文件"); }},SAVE {public void execute() { System.out.println("保存文件"); }};
}// 使用
FileOperation.OPEN.execute(); // 輸出 "打開文件"

6. 在 switch 語句中使用

java

復制

下載

Direction dir = Direction.NORTH;
switch (dir) {case NORTH:System.out.println("向北");break;case SOUTH:System.out.println("向南");break;// ...其他 case
}

7. 單例模式(線程安全)

枚舉是實現單例的最佳方式(避免反射攻擊):

java

復制

下載

public enum Singleton {INSTANCE;public void doSomething() {System.out.println("單例操作");}
}// 使用
Singleton.INSTANCE.doSomething();

關鍵特性總結

特性說明
類型安全編譯時檢查,避免傳入無效值
固定實例枚舉常量在 JVM 中是唯一的(==?比較安全)
支持 OOP可包含字段、方法、構造方法,實現接口,覆蓋方法
線程安全枚舉實例的創建由 JVM 保證,天然適合單例
序列化安全無需額外處理,Java 原生支持枚舉的序列化與反序列化

何時使用枚舉?

  • 需要一組預定義的常量(如狀態、類型、方向等)

  • 需要類型安全且易讀的常量

  • 需要為常量附加行為(方法)

  • 實現單例模式

通過合理使用枚舉,可以大幅提升代碼的可讀性、安全性和可維護性。

Java 枚舉類型完整示例

下面是一個完整的Java枚舉使用示例,展示了枚舉的各種特性:

import java.time.DayOfWeek;public class EnumExample {// 1. 基本枚舉定義public enum Season {SPRING, SUMMER, AUTUMN, WINTER}// 2. 帶屬性和方法的枚舉public enum Planet {MERCURY(3.303e23, 2.4397e6),VENUS(4.869e24, 6.0518e6),EARTH(5.976e24, 6.37814e6),MARS(6.421e23, 3.3972e6),JUPITER(1.9e27, 7.1492e7),SATURN(5.688e26, 6.0268e7),URANUS(8.686e25, 2.5559e7),NEPTUNE(1.024e26, 2.4746e7);private final double mass;   // 千克private final double radius; // 米// 私有構造函數Planet(double mass, double radius) {this.mass = mass;this.radius = radius;}public double getMass() {return mass;}public double getRadius() {return radius;}// 計算表面重力public double surfaceGravity() {final double G = 6.67430e-11; // 引力常數return G * mass / (radius * radius);}// 計算重量public double surfaceWeight(double otherMass) {return otherMass * surfaceGravity();}}// 3. 帶抽象方法的枚舉public enum Operation {ADD("+") {public double apply(double x, double y) {return x + y;}},SUBTRACT("-") {public double apply(double x, double y) {return x - y;}},MULTIPLY("*") {public double apply(double x, double y) {return x * y;}},DIVIDE("/") {public double apply(double x, double y) {if (y == 0) throw new ArithmeticException("Division by zero");return x / y;}};private final String symbol;Operation(String symbol) {this.symbol = symbol;}public String getSymbol() {return symbol;}// 抽象方法 - 每個枚舉常量必須實現public abstract double apply(double x, double y);}// 4. 枚舉實現接口public interface WorkSchedule {String getSchedule();}public enum WorkDay implements WorkSchedule {MONDAY("09:00-17:00") {public String getMotivation() {return "New week, new opportunities!";}},TUESDAY("09:00-17:00") {public String getMotivation() {return "Keep the momentum going!";}},WEDNESDAY("09:00-17:00") {public String getMotivation() {return "Halfway there!";}},THURSDAY("09:00-17:00") {public String getMotivation() {return "Almost there!";}},FRIDAY("09:00-16:00") {public String getMotivation() {return "Weekend is near!";}},SATURDAY("Day Off") {public String getMotivation() {return "Enjoy your weekend!";}},SUNDAY("Day Off") {public String getMotivation() {return "Rest and recharge!";}};private final String schedule;WorkDay(String schedule) {this.schedule = schedule;}@Overridepublic String getSchedule() {return schedule;}// 每個枚舉常量可以有自己的方法實現public abstract String getMotivation();}public static void main(String[] args) {// 1. 基本枚舉使用System.out.println("===== 基本枚舉使用 =====");Season currentSeason = Season.SUMMER;System.out.println("當前季節: " + currentSeason);System.out.println("所有季節:");for (Season season : Season.values()) {System.out.println(season);}System.out.println();// 2. 帶屬性和方法的枚舉System.out.println("===== 行星信息 =====");double earthWeight = 70; // 千克Planet earth = Planet.EARTH;System.out.printf("地球表面重力: %.2f m/s2%n", earth.surfaceGravity());System.out.printf("地球上 %.1f kg 的重量相當于: %n", earthWeight);for (Planet p : Planet.values()) {System.out.printf("在 %-8s上的重量: %6.1f kg%n", p, p.surfaceWeight(earthWeight));}System.out.println();// 3. 帶抽象方法的枚舉System.out.println("===== 數學運算 =====");double x = 10, y = 4;for (Operation op : Operation.values()) {System.out.printf("%.1f %s %.1f = %.1f%n", x, op.getSymbol(), y, op.apply(x, y));}System.out.println();// 4. 枚舉實現接口System.out.println("===== 工作日安排 =====");DayOfWeek today = java.time.LocalDate.now().getDayOfWeek();WorkDay currentDay = WorkDay.valueOf(today.toString());System.out.println("今天是: " + currentDay);System.out.println("工作時間: " + currentDay.getSchedule());System.out.println("每日激勵: " + currentDay.getMotivation());System.out.println();// 5. 在switch語句中使用枚舉System.out.println("===== 根據季節推薦活動 =====");switch (currentSeason) {case SPRING:System.out.println("春天活動: 賞花、踏青");break;case SUMMER:System.out.println("夏天活動: 游泳、露營");break;case AUTUMN:System.out.println("秋天活動: 采摘、登山");break;case WINTER:System.out.println("冬天活動: 滑雪、泡溫泉");break;}System.out.println();// 6. 單例模式System.out.println("===== 單例模式 =====");AppConfig config = AppConfig.INSTANCE;config.setAppName("Enum Demo App");System.out.println("應用名稱: " + config.getAppName());System.out.println("配置ID: " + config.getConfigId());}// 7. 使用枚舉實現單例模式public enum AppConfig {INSTANCE;private String appName;private final String configId = "CONFIG-" + System.currentTimeMillis();public String getAppName() {return appName;}public void setAppName(String appName) {this.appName = appName;}public String getConfigId() {return configId;}}
}

示例說明

1. 基本枚舉 (Season)

  • 最簡單的枚舉形式,只有一組命名常量

  • 使用?values()?方法遍歷所有枚舉值

  • 直接打印枚舉常量會輸出其名稱

2. 帶屬性和方法的枚舉 (Planet)

  • 每個行星有質量和半徑屬性

  • 提供計算表面重力和重量的方法

  • 展示了如何使用枚舉的構造函數初始化屬性

3. 帶抽象方法的枚舉 (Operation)

  • 定義抽象方法?apply(),每個枚舉常量必須實現

  • 每個運算有自己的符號表示

  • 演示了如何為不同枚舉常量提供不同行為

4. 實現接口的枚舉 (WorkDay)

  • 實現?WorkSchedule?接口

  • 每個工作日有自己的時間安排

  • 每個枚舉常量有自己的激勵語實現

  • 結合Java 8的日期API獲取當前星期幾

5. switch語句中使用枚舉

  • 根據當前季節推薦不同的活動

  • 展示了枚舉在switch語句中的類型安全特性

6. 單例模式實現 (AppConfig)

  • 使用枚舉實現線程安全的單例

  • 包含配置屬性和訪問方法

  • 展示了枚舉如何防止反射攻擊和序列化問題

運行結果

運行此程序將輸出類似以下內容(具體結果取決于運行時的日期):

text

復制

下載

===== 基本枚舉使用 =====
當前季節: SUMMER
所有季節:
SPRING
SUMMER
AUTUMN
WINTER===== 行星信息 =====
地球表面重力: 9.80 m/s2
地球上 70.0 kg 的重量相當于: 
在 MERCURY 上的重量:   26.4 kg
在 VENUS   上的重量:   63.1 kg
在 EARTH   上的重量:   70.0 kg
在 MARS    上的重量:   26.5 kg
在 JUPITER 上的重量:  177.0 kg
在 SATURN  上的重量:   74.9 kg
在 URANUS  上的重量:   63.5 kg
在 NEPTUNE 上的重量:   79.6 kg===== 數學運算 =====
10.0 + 4.0 = 14.0
10.0 - 4.0 = 6.0
10.0 * 4.0 = 40.0
10.0 / 4.0 = 2.5===== 工作日安排 =====
今天是: WEDNESDAY
工作時間: 09:00-17:00
每日激勵: Halfway there!===== 根據季節推薦活動 =====
夏天活動: 游泳、露營===== 單例模式 =====
應用名稱: Enum Demo App
配置ID: CONFIG-1717999999999

這個示例全面展示了Java枚舉的各種特性,包括基本用法、帶屬性和方法的枚舉、抽象方法實現、接口實現、在switch語句中使用以及實現單例模式。

?

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

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

相關文章

Docker部署Nginx-UI

使用如下命令拉取運行nginx-ui軟件 docker run -dit \ --namenginx-ui \ --restartalways \ -e TZAsia/Shanghai \ -v /mnt/user/appdata/nginx:/etc/nginx \ -v /mnt/user/appdata/nginx-ui:/etc/nginx-ui \ -v /var/run/docker.sock:/var/run/docker.sock \ -…

OkHttp 3.0源碼解析:從設計理念到核心實現

本文通過深入分析OkHttp 3.0源碼,揭示其高效HTTP客戶端的實現奧秘,包含核心設計理念、關鍵組件解析、完整工作流程及實用技巧。 一、引言:為什么選擇OkHttp? 在Android和Java生態中,OkHttp已成為HTTP客戶端的標準選擇…

洛谷P12170 [藍橋杯 2025 省 Python B] 攻擊次數

題目傳送門 思路 首先定義一個數 n n n ,初值為 2025 2025 2025,從第一回合開始,三個英雄持續攻擊,攻擊方式為: 第一個英雄: 每回合攻擊 5 5 5

百度之星2021——BD202104 萌新

輸入格式: 本題有多組測試數據。 第一行一個數 T (1 ≤ T ≤ 1000) 表示一共有 T 組數據。對于每一組數據,輸入一行兩個數 a,b (1 ≤ a,b ≤ 1000000000)。 輸出格式: 對每組數據,輸出一行兩個數分別表示最小與最大的 c&#xff0…

R語言ICU患者死亡率預測實戰

【圖書推薦】《R語言醫學數據分析實踐》-CSDN博客 《R語言醫學數據分析實踐 李丹 宋立桓 蔡偉祺 清華大學出版社9787302673484》【摘要 書評 試讀】- 京東圖書 (jd.com) 預測ICU患者死亡率對比較藥物的療效、比較護理的有效性、比較手術的有效性有重要意義,利用機…

leetcode240-搜索二維矩陣

leetcode 240 思路 1. 矩陣特性 首先,利用矩陣的特性是解題的關鍵: 每行的元素遞增每列的元素遞增 這意味著,如果我們在矩陣中從右上角或左下角開始搜索,可以有效縮小搜索范圍 2. 從右上角開始搜索 將搜索的起點定位在矩陣…

Linux相關概念和易錯知識點(42)(TCP的連接管理、可靠性、面臨復雜網絡的處理)

目錄 1.TCP的連接管理機制(1)三次握手①握手過程②對握手過程的理解 (2)四次揮手(3)握手和揮手的觸發(4)狀態切換①揮手過程中狀態的切換②握手過程中狀態的切換 2.TCP的可靠性&…

【web應用】若依框架:若依框架中的頁面跳轉簡介

文章目錄 ?前言1. 后端控制器跳轉2. 前端路由跳轉3. 菜單配置跳轉4. 權限控制跳轉5. 常見跳轉路徑 ?一、主目錄頁面跳轉?二、菜單目錄跳轉?總結 標題詳情作者JosieBook頭銜CSDN博客專家資格、阿里云社區專家博主、軟件設計工程師博客內容開源、框架、軟件工程、全棧&#x…

MS9292+MS9332 HD/DVI轉VGA轉換器+HD環出帶音頻

MS9292MS9332是一款HD/DVI轉VGA轉換器HD環出帶音頻的視頻轉換方案。支持HD/DVI輸入,VGA輸出和HD環出,HD/DVI輸入最高支持1920120060Hz,VGA輸出最高支持1920120060Hz,HD環出最高支持4K30Hz。該方案已實現量產,并提供完善…

C++初階-list的模擬實現(難度較高)

1.list(容器,不是類)模擬實現基本結構 這個實現是和源碼的實現不同的,不要進行強制類型轉換了,很麻煩。我們把定義放在.h文件中,在.cpp中放測試代碼。 注:這個基本結構之后會改變,…

【ROS】Nav2源碼之nav2_behavior_tree-行為樹節點列表

1、行為樹節點分類 在 Nav2(Navigation2)的行為樹框架中,行為樹節點插件按照功能分為 Action(動作節點)、Condition(條件節點)、Control(控制節點) 和 Decorator(裝飾節點) 四類。 1.1 動作節點 Action 執行具體的機器人操作或任務,直接與硬件、傳感器或外部系統…

【iOS】cell的復用以及自定義cell

【iOS】cell的復用以及自定義cell 文章目錄 【iOS】cell的復用以及自定義cell前言cell的復用手動(非注冊)自動(注冊) 自定義cell 前言 cell的復用及自定義cell是UITableView或UICollectionView的一個重要優化機制,當用戶滾動視圖…

深度學習之模型壓縮三駕馬車:基于ResNet18的模型剪枝實戰(2)

前言 《深度學習之模型壓縮三駕馬車:基于ResNet18的模型剪枝實戰(1)》里面我只是提到了對conv1層進行剪枝,只是為了驗證這個剪枝的整個過程,但是后面也有提到:僅裁剪 conv1層的影響極大,原因如…

傳輸層協議:UDP

目錄 1、概念 2、報文結構 3、核心特性 3.1 無連接 3.2 不可靠交付 3.3 面向數據報 3.4 輕量級&高效 3.5 支持廣播和組播 4、典型應用場景 5、優缺點分析 6、與TCP的區別 1、概念 UDP(User Datagram Protocol,用戶數據報協議&#xff09…

JVM虛擬機:內存結構、垃圾回收、性能優化

1、JVM虛擬機的簡介 Java 虛擬機(Java Virtual Machine 簡稱:JVM)是運行所有 Java 程序的抽象計算機,是 Java 語言的運行環境,實現了 Java 程序的跨平臺特性。JVM 屏蔽了與具體操作系統平臺相關的信息,使得 Java 程序只需生成在 JVM 上運行的目標代碼(字節碼),就可以…

c++ 面試題(1)-----深度優先搜索(DFS)實現

操作系統:ubuntu22.04 IDE:Visual Studio Code 編程語言:C11 題目描述 地上有一個 m 行 n 列的方格,從坐標 [0,0] 起始。一個機器人可以從某一格移動到上下左右四個格子,但不能進入行坐標和列坐標的數位之和大于 k 的格子。 例…

【匯編逆向系列】七、函數調用包含多個參數之浮點型- XMM0-3寄存器

目錄 1. 匯編代碼 1.1 debug編譯 1.2 release編譯 2. 匯編分析 2.1 浮點參數傳遞規則 2.2 棧幀rsp的變化時序 2.3 參數的訪問邏輯 2.4 返回值XMM0寄存器 3. 匯編轉化 3.1 Debug編譯 3.2 Release 編譯 3.3 C語言轉化 1. 匯編代碼 上一節介紹了整型的函數傳參&#x…

華為云Flexus+DeepSeek征文 | 從零到一:用Flexus云服務打造低延遲聯網搜索Agent

作者簡介 我是摘星,一名專注于云計算和AI技術的開發者。本次通過華為云MaaS平臺體驗DeepSeek系列模型,將實際使用經驗分享給大家,希望能幫助開發者快速掌握華為云AI服務的核心能力。 目錄 作者簡介 前言 1. 項目背景與技術選型 1.1 項目…

【多智能體】受木偶戲啟發實現多智能體協作編排

😊你好,我是小航,一個正在變禿、變強的文藝傾年。 🔔本專欄《人工智能》旨在記錄最新的科研前沿,包括大模型、具身智能、智能體等相關領域,期待與你一同探索、學習、進步,一起卷起來叭&#xff…

Java八股文——Spring篇

文章目錄 Java八股文專欄其它文章Java八股文——Spring篇SpringSpring的IoC和AOPSpring IoC實現機制Spring AOP實現機制 動態代理JDK ProxyCGLIBByteBuddy Spring框架中的單例Bean是線程安全的嗎?什么是AOP,你們項目中有沒有使用到AOPSpring中的事務是如…