Java編程思想——第十九章:枚舉類型

關(guān)鍵字 enum 可以將一組具名的值的有限集合創(chuàng)建為一種新的類型,而這些具名的值可以作為常規(guī)的程序組件使用。

1.基本特性

values() 方法可以返回 enum 實例的數(shù)組,而且該數(shù)組中的元素嚴(yán)格保持其在 enum 中聲明時的順序,因此你可以在循環(huán)中使用 values()返回的數(shù)組。

創(chuàng)建 enum 時,編譯器會為你生成一個繼承 java.lang.Enum 的類。

ordinal() 方法返回一個 int 值,這是每個 enum 實例在聲明時的次序,從0開始,可以使用 == l來比較 enum 實例,編譯器會自動提供equals()方法和 hashCode() 方法。Enum 類實現(xiàn)了 Comparable 接口,所以它 具有 compareTo() 方法。同時,它還實現(xiàn)了 Serializable 接口。

如果在 enum 實例上調(diào)用 getDeclaringClass() 方法,我們就能知道其所屬的 enum 類。

name() 方法返回的 enum 實例聲明時的名字,這與使用 toString() 方法效果相同。 valueOf() 是在 Enum 中定義的 static 方法。它根據(jù)給定的名字方法相應(yīng)的 enum 實例,如果不存在給定的名字實例,將會拋出異常。

1.1 將靜態(tài)導(dǎo)入用于 enum

使用 static import 能夠?qū)?enum 實例的標(biāo)識符帶入當(dāng)前的命名空間,所以無需再用 enum 類型來修飾 enum 實例。

2.向 enum 中添加新方法

一般來說,我們希望每個枚舉實例能夠返回對自身的描述,而不僅僅只是默認(rèn)的 toString() 實現(xiàn),這只能返回枚舉實例的名字。為此,你可以提供一個構(gòu)造器,專門負(fù)責(zé)處理這個額外的信息,然后添加一個方法,返回這個描述信息。

注意,如果你打算定義自己的方法,那么必須在 enum 實例序列的最后添加一個分號。同時,Java要求你必須定義 enum 實例。如果在定義 enum 實例之前定義了任何方法或?qū)傩裕敲淳幾g時就會報錯。

enum 中的構(gòu)造器默認(rèn)為 private 。一旦 enum 定義結(jié)束,編譯器就不允許我們在使用構(gòu)造器來創(chuàng)建任何實例了。

2.1 覆蓋 enum 的方法

覆蓋 toString() 方法,給我們提供了另一種方式來為枚舉實例生成不同的字符串描述信息

3.switch 語句中的 enum

在switch中使用 enum,是 enum 提供的一項的非常便利的功能。一般來說,在 switch 中只能使用整數(shù)值,而枚舉實例天生就具備整數(shù)值的次序,并且可以通過 ordinal() 方法取得其次序,因此我們可以在 switch 語句中使用 enum。

雖然一般情況下我們必須使用enum類型來修飾一個enum實例,但是在case語句中卻不必在如此,直接使用實例即可。

4.values()的神秘之處

編譯器會自動添加 staticvalues() 方法。

可以通過 Class 對象的 getEnumConstants() 方法獲取所以實例。

5.實現(xiàn),而非繼承

所有的 enum 都繼承自 java.lang.Enum類,由于Java不支持多重繼承,所以 enum 不能再繼承其他類。但可以實現(xiàn)一個或多個接口。

6.隨機(jī)選取

7.使用接口組織枚舉

在一個接口的內(nèi)部,創(chuàng)建實現(xiàn)該接口的枚舉,以此將元素進(jìn)行分類,可以達(dá)到將枚舉元素分類組織的目的。

8.使用 EnumSet 替代標(biāo)志

enum 要求其成員是唯一的。

Java SE5引入的 EnumSet ,是為了通過 enum 創(chuàng)建一種替代品,以替代基于 int 的位標(biāo)志。這種標(biāo)志可以用來表示某種開關(guān)信息。

EnumSet 的優(yōu)點是,它在說明一個二進(jìn)制是否存在時,具有更好的表達(dá)能力,并且無需擔(dān)心性能。

9.使用 EnumMap

EnumMap 是一種特殊的Map,它要求其中的鍵必須來自一個 enum。

10.常量相關(guān)的方法

enum 允許程序員為 enum 實例編寫方法,從而為每個 enum 實例賦予各自不同的行為。要實現(xiàn)常量相關(guān)的方法,你需要為 enum 定義一個或多個abstract方法,然后為每個 enum 實例實現(xiàn)該抽象方法。

通過相應(yīng) enum 實例,我們可以調(diào)用其上的方法。這通常也稱為 表驅(qū)動的代碼(table driven code)。

每個 enum 元素都是 static final 實例,所以他們無法訪問外部類的非靜態(tài)元素或方法。



10/06/2019 :created
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容