2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
我很久以前就檢查過這種方法,我決定使用手動代替循環(huán)值沒有任何好處Map
。
地圖發(fā)生在內(nèi)存中
要使 map with
O(1)
search 確實(shí)比O(n)
手動循環(huán)好,enum 應(yīng)該有 1000 多個(gè)常量(這是實(shí)驗(yàn)數(shù)字)。但根據(jù)我的經(jīng)驗(yàn),我有最多 200 多個(gè)常量的枚舉國家。在最壞的情況下,這也不是整個(gè)應(yīng)用程序的瓶頸。
我總是使用手動循環(huán)并且不擔(dān)心性能。許多序列化框架(如 Jackson 將 enum 轉(zhuǎn)換為 json)使用Enum.valueOf()
.

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超3個(gè)贊
要記住的一件事是,一旦初始化,靜態(tài)地圖將無限期地保存在內(nèi)存中;循環(huán)方法只會values()在循環(huán)迭代期間保存通過調(diào)用創(chuàng)建的數(shù)組。
但是,值得指出的是,使用 holder 類沒有任何優(yōu)勢:因?yàn)槟窃跇?gòu)造函數(shù)中添加到映射中的,所以在調(diào)用構(gòu)造函數(shù)時(shí)會立即初始化 holder 類。
因此,您也可以使用普通的舊靜態(tài)(最終)字段。
同樣值得考慮的是,這種方法必然要求映射是可變的。您可能不打算對其進(jìn)行變異,但是防御性地改變方法是值得的,這樣您就不能。
相反,您可以直接在字段上初始化:
static final Map<Integer, HttpStatus> map =
Collections.unmodifiableMap(
Stream.of(HttpStatus.values())
.collect(toMap(s -> s.value, s -> s)));
(或使用類似 Guava 的東西ImmutableMap)
關(guān)于直接初始化映射的方法的另一點(diǎn)是它不會在構(gòu)造函數(shù)中添加到映射中——這意味著您實(shí)際上不必將其放入枚舉類本身。這使您可以靈活地在無法更改代碼的枚舉上使用它,和/或僅將地圖添加到您發(fā)現(xiàn)有性能需求的地方。
添加回答
舉報(bào)