Java枚舉詳解

一、什么是枚舉類型

????????枚舉類型是一種特殊的數據類型,用于定義一組固定的命名常量。枚舉類型提供了一種更強大、更安全和更易讀的方式來表示一組相關的常量。

????????在Java中,枚舉類型是通過使用enum關鍵字來定義的。枚舉類型可以包含一個或多個枚舉常量,每個常量都是枚舉類型的實例。枚舉常量是在枚舉類型中預先定義的,它們是唯一的、已命名的對象。

????????在Java中,枚舉類型是一組固定常量值的集合,每個常量值代表一個特定的數據類型。枚舉在Java中被視為數據類型,你可以使用它們來創建枚舉類型的變量、數組、參數等。

二、枚舉的引入

要求創建一個季節(Season)類,只能創建春夏秋冬4個對象。

  • 舊方法:假如按照以往的思路,只能創建一個普通的Season 類。
  • 代碼如下:

public class Enumeration01 {public static void main(String[] args) {//使用Season spring = new Season("春天", "溫暖");Season winter = new Season("冬天", "寒冷");Season summer = new Season("夏天", "炎熱");Season autumn = new Season("秋天", "涼爽");Season other = new Season("紅天", "~~~");// 可以隨意多創建對象,不滿足題目要求
//     autumn.setName("XXX");// 會改變對象的屬性,不滿足題目的要求
//     autumn.setDesc("非常的熱..");}
}
class Season{//類private String name;private String desc;// 季節描述public Season(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}
}

????????思考:使用普通類的定義,我們不能體現Season 類只有4個固定的對象,因為使用者可以隨意創建更多的對象。因此我們需要一種特殊的類,可以限制使用者創建的對象的個數與類型 ---- 于是便引入了枚舉類。
????????枚舉(enumeration):枚舉是一組常量的集合;它是一種特殊的類,里面只包含一組有限的特殊的不能修改的對象。

三、枚舉的基本用法

  • 使用 enum 關鍵字實現枚舉:

使用步驟:
(1)使用 enum 關鍵字取代 class 關鍵字定義一個類,該類便稱為枚舉類。
(2)在枚舉類內部直接創建對象,枚舉類對象是默認使用 public static final 一起修飾的,如果有多個對象,則必須且只能使用(,)間隔開。
(3)在枚舉類中將構造器私有化,防止外部隨意創建枚舉類對象。
(4)只保留屬性的get 方法,不提供屬性的 set 方法,防止枚舉類的對象屬性被更改。

  • 將上例代碼修改如下:

public class Enumeration03 {public static void main(String[] args) {System.out.println(Season.AUTUMN);System.out.println(Season.SUMMER);}
}enum  Season {//類//定義了四個靜態對象,使用了enum 來實現枚舉類/*1. 使用關鍵字 enum 替代 class;2. public static final Season SPRING = new Season("春天", "溫暖") 直接使用SPRING("春天", "溫暖") 來代替,即常量名(實參列表);3. 如果有多個常量(對象), 使用 , 號間隔即可;4. 如果使用enum 來實現枚舉,要求將定義常量對象的語句,寫在第一行;5. 如果我們使用的是無參構造器,創建常量對象,則可以省略括號();*/SPRING("春天", "溫暖"), WINTER("冬天", "寒冷"), AUTUMN("秋天", "涼爽"),SUMMER("夏天", "炎熱");// 調用了構造器// 下面定義對象的語句和上面的效果是一樣的。
//    public static final Season SPRING = new Season("春天", "溫暖");
//    public static final Season WINTER = new Season("冬天", "寒冷");
//    public static final Season AUTUMN = new Season("秋天", "涼爽");
//    public static final Season SUMMER = new Season("夏天", "炎熱");private String name;private String desc;private Season() {//無參構造器}private Season(String name, String desc) {this.name = name;this.desc = desc;}public String getName() {return name;}public String getDesc() {return desc;}// 打印對象的信息@Overridepublic String toString() {return "Season{" +"name='" + name + '\'' +", desc='" + desc + '\'' +'}';}
}
  • 說明:使用 enum 關鍵字后,Season 類中的對象變成了固定的對象,這樣便能滿足我們一開始提出的要求了。
  • 對比圖如下:

四、枚舉的注意事項和細節?

(1)當我們使用 enum 關鍵字開發一個枚舉類時,默認會繼承 Enum 類,而且是一個 final 類,不能再被其他類繼承。
(2)傳統的 public static final Season2 SPRING = new Season2(“春天”, “溫暖”); 簡化成 SPRING(“春天”, “溫暖”), 這里必 須知道,它調用的是哪個構造器。
(3)如果使用無參構造器 創建 枚舉對象時,其實參列表和小括號都可以省略。
(4)當有多個枚舉對象時,使用(,)間隔,最后由一個分號結尾。
(5)定義類枚舉對象的語句必須放在枚舉類的第一句。

(6)使用 enum 關鍵字后,就不能再繼承其它類了,因為 enum 類會隱式繼承 Enum,而 Java 是單繼承機制。

五、枚舉類的常用方法

以下是枚舉類型常用的方法以及它們的用途:

  • 代碼演示:
public class EnumMethod {public static void main(String[] args) {//使用Season 枚舉類,來演示各種方法Season autumn = Season.AUTUMN;//輸出枚舉對象的名字  AUTUMNSystem.out.println(autumn.name());//ordinal() 輸出的是該枚舉對象的次序/位置號,從0開始編號//AUTUMN 枚舉對象是第三個,因此輸出 2System.out.println(autumn.ordinal());// values方法,返回 Season2[]// 含有定義的所有枚舉對象Season[] values = Season.values();System.out.println("===遍歷取出枚舉對象(增強for)====");for (Season season: values) {System.out.println(season);}//valueOf:將字符串轉換成枚舉對象,要求字符串必為已有的對象名,否則報異常//執行流程//1. 根據你輸入的 "AUTUMN" 到 Season2的枚舉對象去查找//2. 如果找到了,就返回,如果沒有找到,就報錯Season autumn1 = Season.valueOf("AUTUMN");System.out.println("autumn1=" + autumn1);System.out.println(autumn == autumn1);//compareTo:比較兩個枚舉常量,比較的就是位置號// 就是把 Season.AUTUMN 枚舉對象的位置號 和 Season.SUMMER枚舉對象的位置號比較/*源碼如下:public final int compareTo(E o) {return self.ordinal - other.ordinal;}*/// Season.AUTUMN的編號[2] - Season.SUMMER的編號[3]System.out.println(Season.AUTUMN.compareTo(Season.SUMMER));// 最后補充了一個增強forint[] nums = {1, 2, 9};//普通的for循環System.out.println("=====普通的for=====");for (int i = 0; i < nums.length; i++) {System.out.println(nums[i]);}System.out.println("=====增強的for=====");//執行流程是 依次從nums數組中取出數據,賦給i, 如果取出完畢,則退出forfor(int i : nums) {System.out.println("i=" + i);}}
}

六、枚舉的優缺點

優點:

1.易讀性和可維護性:枚舉類型中的常量是有意義的、自描述的,使得代碼更易讀、易理解和易于維護。枚舉常量具有唯一的名稱,提供了更好的文檔和注釋。

2.類型安全:枚舉類型在編譯時進行靜態類型檢查,這意味著編譯器可以確保只使用有效的枚舉常量,提供了更高的類型安全性。

3.可限定的值集合:枚舉類型定義了一個有限的值集合,限定了有效的取值范圍。這可以幫助避免程序中出現無效或意外的取值。

4.避免魔法數值:使用枚舉類型可以避免使用硬編碼的魔法數值,提供了更好的代碼可讀性和可維護性。

5.增強的編譯器支持:枚舉類型在編譯器層面提供了一些額外的支持,如自動添加常用方法(如values()、valueOf())、枚舉常量的順序等。

6.適用于狀態和選項的表示:枚舉類型非常適用于表示狀態、選項和固定集合,如季節、顏色、星期幾等。
?

缺點:

1.不適用于動態變化的數據:枚舉類型是在編譯時定義的,其常量集合是固定的。如果需要表示動態變化的數據集合,枚舉類型可能不適合。

2.不適用于大型數據集合:如果需要表示大型的數據集合,枚舉類型的常量定義可能會變得冗長和繁瑣。

3.缺乏擴展性:枚舉類型的常量是在編譯時確定的,不支持動態添加或刪除常量。因此,如果需要頻繁地修改常量集合,可能會導致代碼的改動和維護成本的增加。

4.不支持繼承:枚舉類型不支持繼承,無法實現枚舉類型之間的繼承關系。
?

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

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

相關文章

常見狀態碼總結

常見狀態碼總結 2xx 200 OK&#xff1a;表示服務器成功處理了客戶端的請求&#xff0c;并返回所請求的數據。這是最常見的狀態碼&#xff0c;表示一切正常。201 Created&#xff1a;表示服務器成功處理了客戶端的 POST 請求&#xff0c;并在服務器上創建了新的資源。204 No C…

vue005——vue組件入門(非單文件組件和單文件組件)

一、非單文件組件 1.1、單文件組件的使用 1.1.1、局部注冊 1、第一步&#xff1a;創建school組件 2、第二步&#xff1a;注冊組件&#xff08;局部注冊&#xff09; 3、第三步&#xff1a;使用組件&#xff08;編寫組件標簽&#xff09; <!DOCTYPE html> <html>…

設計模式—里氏替換原則

1.概念 里氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一。 里氏代換原則中說&#xff0c;任何基類可以出現的地方&#xff0c;子類一定可以出現。 LSP是繼承復用的基石&#xff0c;只有當衍生類可以替換掉基類&#xff0c;軟件單位的功能不受到影…

Spring注解方式整合第三方框架

目錄 Spring整合MyBatis 原有xml方式整合配置如下 注解方式&#xff1a; Import可以導入如下三種類 第三方框架是指由其他開發者或團隊開發的軟件模塊或庫&#xff0c;供開發者在自己的應用程序中使用。這些框架通常提供了一系列已經封裝好的功能或工具&#xff0c;可節省開…

使用flask返回json格式的數據

Flask Flask是一個使用Python編寫的輕量級Web框架&#xff0c;它的設計理念是保持簡單、靈活和易擴展。它的核心是Werkzeug和Jinja2&#xff0c;并且它本身只提供了非常基礎的Web框架功能&#xff0c;例如路由和請求處理等。 使用Flask可以快速創建一個Web應用程序&#xff0c;…

跳躍游戲Ⅱ[中等]

優質博文&#xff1a;IT-BLOG-CN 一、題目 給定一個長度為n的0索引整數數組nums。初始位置為nums[0]。每個元素nums[i]表示從索引i向前跳轉的最大長度。換句話說&#xff0c;如果你在nums[i]處&#xff0c;你可以跳轉到任意nums[i j]處: 0 < j < nums[i] i j < n …

【Python 訓練營】N_8 打印阿姆斯特朗數

題目 輸入一個數&#xff0c;判斷是否為阿姆斯特朗數&#xff0c;阿姆斯特朗數指一個n位正整數等于其各位數字的n次方之和。其中n為3時是水仙花數。 分析 利用循環&#xff0c;獲取數的長度&#xff0c;根據長度和定義&#xff0c;拆分出來運算 答案 while True:n int(in…

【Python 訓練營】N_7 打印水仙花數

題目 打印出1000以內所有的"水仙花數"&#xff0c;所謂"水仙花數"是指一個三位數&#xff0c;其各位數字立方和等于該數本身。例如&#xff1a;153是一個"水仙花數"&#xff0c;因為1531的三次方&#xff0b;5的三次方&#xff0b;3的三次方。 …

數學啟發式

學習資料&#xff1a; 優化求解器 | Gurobi 數學啟發式算法&#xff1a;參數類型與案例實現 數學啟發式算法 | 可行性泵 (Feasibility Pump)算法精講&#xff1a;一份讓您滿意的【理論介紹編程實現數值實驗】學習筆記(PythonGurobi實現) 大佬到底是大佬&#xff01;這些資料太…

Mac Ubuntu雙系統解決WiFi和WiFi 5G網絡不可用問題

文章目錄 設備信息1. Ubuntu WiFi不可用解決方式查看Mac的網卡型號根據網卡型號搜索獲取到的解決方法查看WiFi名字問題參考鏈接 2. 解決WiFi重啟后失效問題打開終端創建.sh腳本文件編輯腳本文件復制粘貼腳本修改腳本權限創建并編輯systemd service文件復制粘貼下文到systemd se…

Typescript怎樣對URL參數進行編碼?

URL中的參數需要進行編碼&#xff08;URL encoding&#xff09;是為了確保傳輸的參數不包含特殊字符&#xff0c;同時確保數據的可靠性和安全性。 特殊字符如空格、&、?等在URL中有特殊含義&#xff0c;如果直接包含在參數值中&#xff0c;可能會導致解析錯誤或者安全問題…

只考數據結構,計算機評級C+,成都信息工程大學考情分析

成都信息工程大學(C) 考研難度&#xff08;☆☆&#xff09; 內容&#xff1a;23考情概況&#xff08;擬錄取和復試分析&#xff09;、院校概況、24專業目錄、23復試詳情、各專業考情分析、各科目考情分析。 正文1715字&#xff0c;預計閱讀&#xff1a;3分鐘 2023考情概況 …

Java實現求最大值

1 問題 接收用戶輸入的3個整數&#xff0c;如何將最大值作為結果輸出。 2 方法 采用“截圖文字代碼”的方式描述。 引入輸入包調用main()函數&#xff0c;提示并接收用戶輸入的3個整數&#xff0c;并交由變量a b c來保存。對接收的3個數據進行比較&#xff0c;先比較a和b&#…

原型 原型對象 原型鏈

在面向開發對象開發過程中對每一個實例添加方法&#xff0c;會使每一個對象都存在該添加方法造成空間浪費 通過對原型添加公共的屬性或方法&#xff0c;使所有實例對象都可訪問 原型為了共享公共的成員 prototype 原型: JS為每個構造函數提供一個屬性prototype(原型),它的值…

PostgreSQL數據庫初接觸

PostgreSQL默認端口為5432 windows下服務名為PostgreSQL-x64-10 10為版本 進程名為pg-ctl.exe 備份數據庫命令&#xff1a; pg_dump -h localhost -p 5432 -U postgres -f d:\20231124.dmp tcsl7//tcsl7為數據庫名 開始用-d 指定數據庫&#xff0c;后來提示沒-d參數 還…

在服務器復用他人的anaconda3(免安裝)

在服務器復用他人的anaconda3 1. 復制他人的anaconda3文件夾2. 修改配置文件3. 修改環境路徑和包路徑 1. 復制他人的anaconda3文件夾 cp -r /home/xxx/anaconda3 /home/your_username2. 修改配置文件 vim anaconda3/etc/profile.d/conda.sh # 替換原來的用戶名為自己的用戶名…

SELinux零知識學習二十八、SELinux策略語言之類型強制(13)

接前一篇文章:SELinux零知識學習二十七、SELinux策略語言之類型強制(12) 二、SELinux策略語言之類型強制 4. 類型規則 類型規則在創建客體或在運行過程中重新標記時指定其默認類型。在策略語言中定義了兩個類型規則: type_transtition在域轉換過程中標記行為發生時以及創…

jQuery 3.0 新增了哪些特性?(jQuery 3 所引入的那些最重要的變化)

文章目錄 前言簡介新增特性Use of requestAnimationFrame() for Animationsunwrap() 方法 有變更的特性data() 方法Deferred 對象SVG 文檔 已廢棄、已移除的方法和屬性廢棄 bind()、unbind()、delegate() 和 undelegate() 方法移除 load()、unload() 和 error() 方法移除 conte…

計算機應用基礎_錯題集_OutLook操作題_操作系統應用題_電子表格---網絡教育統考工作筆記005

6、(說明:考生單擊窗口下方的“打開[Outlook]應用程序”啟動Outlook) 按以下要求保存草稿。 收件人:test_xiao_ming@163.com

深眸科技聚焦AI機器視覺檢測,驅動3C電子行業集成創新實現新需求

隨著消費的升級及國家政策的助推&#xff0c;國內3C電子市場不斷擴大&#xff0c;行業實現高速發展。近年來&#xff0c;3C電子產品持續迭代&#xff0c;生產工藝也逐漸復雜化&#xff0c;相關生產線定位組裝、零部件檢測、整機產品檢測等環節&#xff0c;亟需使用具備較強適應…