2013-02-04 18 views
1

我有大約30個處理程序例程以字符串形式給定例程名稱時進行分派。 因此,在工廠方法中,調度例程的一種自然方式是使用一系列if...else來比較例程名稱以適應插槽。它的工作原理,但毫無疑問,隨着例程數量的增加,它變得笨拙和低效。我想出了一個使用枚舉和EnumMap的時尚:每當我添加一個例程,我添加一個枚舉實例,並將其註冊到EnumMap(例程名稱和例程類別作爲鍵和值)。如何在Java中使用EnumMap進行qiuck查找?

正如我知道,當實例的數目是小於64(長型長度),所述EnumMap的實現使用一個long作爲位陣列和使用位偏移做putget,所以它速度非常快,只要例程數少於64(我非常適合我的情況),當我調度例程時,我可以獲得O(1)性能。

然而,EnumMap的的限制是其key type只能是Enum,而不是String, ,我無法用常規的域名(string)做一個快速查找....

有什麼辦法可以解決這個問題嗎? 或者,如果只有我可以用一個按鍵:)

+3

爲什麼不使用'HashMap'?對你來說太慢了嗎? –

+0

爲什麼你給字符串形式的例程名?是否可以使用多態方法並避免整個問題? – EJP

+0

@Nikita Beloglazov,其實我現在用它,我只是想知道EnumMap怎麼樣,呃..也許這不是一個好的選擇。 – larmbr

回答

2

值做一個反向查找我會保持它的簡單,只需使用一個HashMap<String, Handler>,直到你能證明這是一個嚴重的瓶頸。我假設在這裏,有一個共同的超類或接口,所有的處理程序擴展,所以你可以做

handlers.get(name).handle(...); 

EnumMap的不會有任何更快,如果你從一個String鍵起你首先得使用valueOf來獲得對應字符串的枚舉值,並且this is itself implemented as a lookup in a HashMap ...

相關問題