SCJP認證 1.5.5(2) 聲明枚舉

因爲枚舉確實是一種特殊的類,因而它不僅僅用於列出枚舉的常量值。可以爲枚舉添加構造函數、實例變量、方法,以及一種稱爲“常量特定類體”(constant specific class body)的奇怪東西。爲了理解爲什麼在枚舉中可能需要更多功能,對上述例子考慮如下這種情形:假設你想知道實際的大小(以盎司爲單位)它們映射到3個CoffeeSize常量中的每一個常量。例如,你想知道BIG是8盎司,HUGE是10盎司,而OVERWHELMING是巨大的16盎司。

雖然可以使用某種其他的數據結構製作某種查找表,但這不是一個號的設計,並且難於維護。最簡單的方式是將枚舉值(BIG、HUGE和OVERWHELMING) 是做對象,它們都可以具有自居的實例變量。然後,可以通過將值傳遞給枚舉構造函數,在初始化枚舉時同時賦予這些值。着需要做一點解釋,我們首先看一下如下的代碼:

它會產生如下結果:

8

BIG 8

HUGE 10

OVERWHELMING 16

 

注意,每個枚舉都有一個靜態方法values(),它以聲明枚舉值是的順序返回這些值的一個數組。

對於枚舉構造函數,要重點集中丶兩點如下所示。

永遠不能直接調用枚舉構造函數。通過在常量後面定義的變元,會自動調用枚舉構造函數。例如,如用BIG(8) 調用CoffeeSize構造函數,則會獲取一個int變元,冰箭int型字面值8傳遞個i構造函數(當然,在這種情況下,可以攝像BIG也會傳遞給構造函數,但是,我們不必知道或者說不必關係其細節)。

可以爲溝改造函數定義多個變元,並且重載枚舉構造函數,就像重載一個普通的類構造函數一樣。第2章將更詳細地討論構造函數。爲了同時用盎司數和(例如) 蓋子類型初始化CoffeeType,可將帶兩個變元的BIG(8, 'A')傳遞給構造函數,這意味着在CoffeeSize中有一個構造函數,它同時具有一個int變元和一個String變元。

最後,可以在枚舉中定義一個奇怪的東西,它看起來就像匿名內部類一樣(匿名內部類將在第8章討論) 。它被稱作常量特頂類體,當需要特殊的常量一重寫枚舉中定義的方法時,就可以使用它。

攝像如下這種場景:你想讓枚舉具有兩個方法,一個用於盎司數,一個用於蓋子代碼(String類型) 。現在攝像多數咖啡(杯)使用相同的蓋子代碼“B”,但是需要有一種方法爲OVERWHELMING二重寫該方法。你不希望在方法中編寫一些難以維護的if/then代碼,因此,最佳辦法是以某種方式獲得擁有重寫getLidCode()方法的OVERWHELMING常量。

這看起來有些奇怪,但理解了如下基本的生命規則之後,就不覺得奇怪了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章