2012-01-27 85 views
2

我有一個名爲AbstractServer的包 - 私有接口,它提供了三種方法:start()stop()init()每個接口的唯一標識符 - 實現

對於每個新服務器,我都實現了接口並覆蓋了這些方法。之後,我將這臺新服務器註冊到我的公共ServerManager-class,該服務器收集HashMap中的所有服務器,並以特定順序調用其公開的方法。

因此,所有已註冊的服務器從其他地方出發的代碼只是看起來是這樣的:

ServerManager.INSTANCE.startServers(); 

我目前所面臨的問題,我希望能夠從ServerManager刪除服務器s地圖。

我的想法是向接口引入一個public static final String IDENTIFIER字段,並將其用作HashMap中的鍵。這樣,除去從ServerManager服務器,我會寫:

ServerManager.INSTANCE.removeServer(HttpServer.IDENTIFIER); 

的問題是,我不能在界面中的「抽象」屬性,因此不能強制實現重寫它。

我也不能使用普通方法(非靜態),因爲服務器實現的構造函數將是包私有的。

作爲替代,我想過使用實現的Class作爲HashMap的鑰匙,所以我可以寫的東西是這樣的:

ServerManager.INSTANCE.removeServer(HttpServer.class); 

對這個有什麼想法?

+0

使用該類作爲關鍵是一個不錯的選擇。 – Marcelo 2012-01-27 14:40:59

+0

你目前使用什麼作爲你的Map中的鍵,並且可以有多個特定服務器的實例? – quaylar 2012-01-27 14:44:41

+0

@quaylar我正在使用一個字符串,但它不存儲在任何地方,所以你必須知道確切的價值。感覺像蝙蝠練習給我。 – 2012-01-27 15:02:52

回答

2

如果你知道每個實現類最多隻有一個實例,那麼使用Class對象作爲關鍵是一個非常自然的解決方案。

如果你不這樣做,那麼顯然這些ID必須是特定於實例而不是特定於類的。

+0

只有每個實現的實例。 – 2012-01-27 15:03:35

0

什麼定義枚舉ServerIdentifier所有可能的服務器類型和接口:

ServerIdentifier getServerIdentifier(); 

你的地圖然後可以是Map<ServerIdentifier, List<AbstractServer>>,你甚至將能夠管理一個服務器類型的多個實例...

與使用類對象作爲關鍵的優點只是處理服務器類型的一種更自然的方式,因爲您可以使用枚舉並且不必比較類對象...

+0

問題是,我需要以靜態的方式獲取標識符(它可能是什麼),因爲構造函數是包私有的。 '.class'成員總是以這種方式可用,而您不能在接口中定義靜態方法。 – 2012-01-27 16:09:00