2011-01-09 81 views
2

可以說我有一個枚舉類 - ConfigElement其中有一些成員喜歡GENERAL_CONFIG("General Configuration"),TRANSIT_TIMES("Transit times")強制靜態映射中通用接口的具體類的映射

所有這些配置元素的個人類,實現公共接口的ConfigElementOP,例如

public class TransitTimesOp implements ConfigElementsOp{ 
    //implementation of interface methods 
} 

這些單獨的類定義某種行爲是特定於它們。

現在,應用程序的控制器只是獲取特定的ConfigElement,然後在工廠的幫助下,找出具有相應行爲的類並相應地使用它。

目前,我廠只是ConfigElement和其行爲的類之間的靜態地圖,像

public static Map<ConfigElement, ConfigElementsOp> ConfigElementBehaviourMap = 
    new HashMap<ConfigElement, ConfigElementsOp>(); 

ConfigElementBehaviourMap.put(ConfigElement.TRANSIT_TIMES, TransitTimesOp.class); 
... 

我有兩個問題與此:

  1. 也是本作的正確的設計廠?對我來說似乎更加混亂,因爲任何新元素和行爲的添加都需要在多個位置進行更改,並且將其包含在此靜態映射中的缺失將會被編譯器無視地忽略。假設我們使用這種工廠設計(靜態映射),是否有強制爲配置元素定義的任何新類都進入此映射的任何方法。而任何這樣的錯過,將是一個編譯時錯誤。

用法可以通過以下方式描述 - 各種控制器將需要此枚舉的不同行爲映射。因此,可以說--UI控制器將有一個地圖說明如何顯示一個特定的配置元素,串行器將有另一個可供使用的地圖,它是ConfigElement和它的特定序列化器之間的映射。特定的控制器在工作時將從其地圖中獲取ConfigElement的相應行爲並使用它。

在此先感謝。

回答

2

除了現有的字符串參數之外,您還可以使用類參數增強枚舉,並直接從枚舉中檢索類。這是我實施它的方式。

+0

此ConfigElement枚舉列表由其中一個依賴包給出,而且枚舉也可以在其他地方使用。 – kshtjsnghl 2011-01-09 19:25:56

+0

在這種情況下,地圖是一個非常好的解決方案。在Java中HashMaps閃電般快,所以應該沒有問題。 – Daniel 2011-01-09 19:28:12

0

首先,因爲密鑰是一個枚舉,所以您應該使用EnumMap這是爲這種情況量身定製的。

靜態地圖的工作代價可能是在包含地圖的類和ConfigElementOp實現之間引入強依賴關係。

什麼是大圖,你打算如何使用你的Map