是枚舉?還是常量?其實很好選擇!


一、什么是枚舉?

首先,枚舉是一種特殊的類對象,其定義如下:

{修飾符} enum 對象標識 [父接口] 枚舉體

枚舉類型通過一些特殊的約束,來實現其應用特性:

1、枚舉不可定義為abstract 或者 final,否則會引發編譯器錯誤。

2、枚舉實現了Comparable及Serializable接口,因此可以進行比較及序列化等操作,類型定義如下:

3、枚舉類型只能通過內部的枚舉常量進行初始化

4、枚舉類型clone方法定義為final,即不可復制,否則會拋出異常:

5、枚舉類型無法通過反射機制進行初始化。

6、枚舉類型需要自定義處理序列化,反序列化,默認的序列化使用會拋出異常。

7、枚舉類型equals定義為final,不可自定義覆蓋,同關聯hashCode方法。

8、枚舉類型finalize定義為final,意味着枚舉實例可能永遠不會被垃圾回收。

二、枚舉的初始化

如下圖,我們定義EnvEnum類型枚舉,然后通過PROD、RELEASE、DEV枚舉常量初始化了三個EnvEnum實例:

枚舉常量體可以包含參數,參數會通過構造函數進行枚舉類型的初始化。

枚舉體相當於定義了一個內部匿名類,但是不可包含構造函數及abstract方法。

枚舉類型的構造函數有以下特殊約定限制:

1、構造函數默認為private修飾(不可外部初始化構造),不可使用public 或者 protected修飾,否則會導致編譯錯誤。

2、不可在構造函數內調用父類構造函數。

3、枚舉類型會默認聲明無參構造函數。

三、枚舉的一些特性

1、valueOf:根據枚舉常量名稱查找枚舉實例。

枚舉類型提供根據名稱查詢實例方法,需要注意的是,如果查找不到匹配的實例,則會拋出異常。

2、compareTo:提供枚舉實例對比方法

對比需要再同類型枚舉實例間,根據枚舉實例的ordinal對比實現。 

四、關於使用枚舉、常量

其實,很多情況下,枚舉和常量可以替代使用,對於第二部分 EnvEnum 示例,我們可以定義常量類如下:

但是,在實際應用中,在不同情景下的使用便捷性及代碼復雜度上,卻有着不小的區別:

1、對比、查找

當需要做同類型對比,查找類操作時,常量類需要對相應的常量組定義,實現相應的功能方法。

可預知的是在實際應用中,會有很多不同類型組常量應用需求,那么各組變量的對比,查找則需要分別去實現,而枚舉相應的功能囊括在枚舉類型定義中,可以直接使用。

2、關聯性的使用

本篇中,我們定義了不同環境的(appId、appPort)配置使用,即,在使用PROD環境配置的appId時,同時可能會使用其appPort。在不同應用情景中,可能存在更多特性配置的關聯使用,這就很可能造成使用中的關聯性、匹配性的麻煩和混亂。比如,不小心組合使用了PROD_APP_ID和RELEASE_APP_PORT兩個變量。

枚舉實例將所有的關聯特性包裝在一起,更適合此種情景應用,如:(EnvEnum.PROD.getAppId()、EnvEnum.PROD.getAppPort())

總的來說,常量更適用於單一或者單一組合的全局性應用,而枚舉更適合多組合多屬性關聯的復雜情景應用。

當然,我們這里只是說適合,不是必需。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM