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

2022-01-10 16:02:38 字數 1733 閱讀 8050

首先,列舉是一種特殊的類物件,其定義如下:

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 示例,我們可以定義常量類如下:

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

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

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

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

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

是選擇Oracle,MySQL還是NoSQL?

oracle全才,無論olap還是oltp,無論是鎖定機制還是事物支援,無論是內建函式還是外部可擴充套件功能,都比較全面。mysql oltp型選手,但由於缺少 hash join,以及分析函式相對較少,所以olap方面功能相對欠缺,但對事務的支援以及鎖定機制都比較齊全。nosql k v 型選手,...

買房還是租房,你的選擇是?

在郊外貸款買大房子 在市中心租公寓究竟應該貸款買房還是租房住,這簡直就是一道永遠解不開的題目啊!哪乙個選擇會比較好,真是不能一概而論。能夠活多少年 住在什麼樣的房子裡 貸多少年的款等,根據這些條件,損益都會發生變化,什麼樣的居住條件讓人更加有幸福感,也是由每個人的價值觀決定的。但是,如果你的目標是成...

是教育選擇了我們還是我們選擇了教育

縱觀論壇教師不滿言論,不外乎幾類 一說 投入不足,教師收入得不到保障 二說領導辦事不公,教師權益得不到保護 三說學生品德不佳,教師職業得不到尊重 四說家長態度不好,教師工作得不到理解。總之是錢少壓力大教書很難。站在教師的角度想一想,為什麼我們會是教師,是教育選擇了我們還是我們選擇了教育。我們寒窗數年...