2014-11-06 37 views
3

在我最近的工作一個大的Java代碼的基礎上,我看到了下面的代碼:爲什麼映射助手擴展hashmap會有用?爲什麼不使用hashmap?

public class MapHelper extends HashMap<String, Object>{ 

    private static final long serialVersionUID = 1L; 

    public MapHelper() { 
     super(); 
    } 

    public MapHelper(MapHelper mh) { 
     super(mh); 
    } 

    public MapHelper as_dict(String key) { 
     return (MapHelper)this.get(key); 
    } 
} 

我不知道如何做到這一點是有用的。有沒有例子可以揭示上述MapHelper的用處?

+2

檢查VCS並詢問作者。 – 2014-11-06 22:03:56

+7

你所犯的錯誤是假設你繼承的代碼必須是有用的或者存在的理由。 – khelwood 2014-11-06 22:05:19

+0

看起來像它已經完成,以保存客戶端從Object投射到MapHelper的HashMap值,但需要更多的上下文才能真正知道,所以我同意@Markus Malkusch – 2014-11-06 22:05:35

回答

6

確實顯得比較輕浮的方式,它是現在;但是:

  1. 它可以讓他們參考HashMap<String, Object>MapHelper這是較短的,並保證一致性。另見'Is there a Java equivalent or methodology for the typedef keyword in C++?'

  2. as_dict是執行演員的實用方法。他們似乎對該地圖包含的內容有遠見。這個比內嵌投射更安全,因爲演員只在一個地方定義。錯誤餘量較小。

  3. 它可以讓他們稍後添加額外的功能,而無需更新整個代碼庫。

  4. 作爲頂級類擴展HashMap使泛型類型參數具有通用性,也就是說,它們在運行時通過反射可用。請參閱this blog post by Neal Gafter更詳細地解釋此功能。

所以實際上有很多小而合法的理由。

有一些像這樣的例子在Java API中,如:

+0

我也概述了第4點,但它並不是一個好的論點,因爲你不需要反射,因爲你已經知道它是,因爲類是像那樣編譯的。 – dognose 2014-11-06 22:20:57

+0

@ dognose我同意他們似乎不太可能使用這個功能,但這仍然是可以完成的原因之一。 – Radiodef 2014-11-06 22:24:23

+0

對於來自java api的示例+1。 – dognose 2014-11-07 14:47:22

3

看起來這個級別的唯一目的是有一個快捷方式

而不是做

Map<String, Map<String, Map<String, Map<String, Object>>>> myMap = new HashMap<String, HashMap<String, HashMap<String, HashMap<String, Object>>>>(); 

(這是壞的閱讀)的

你可以使用

MapHelper myHelper = new MapHelper(new MapHelper(new MapHelper(new MapHelper()))); 

因爲MapHelper將正好限制了泛型類型的屬性是StringObject

Finall想象一下,你想在不知道深度的情況下檢查ANY元素是否等於「1」 - 你可以一次又一次地調用遞歸方法 - 或者在MapHelper上執行一次

if (myHelper.contains("1")); 
0

類的目的是爲了防止您不必硬編碼HashMap<String, Object>每一個地方你想使用這種類型的地圖(它增加了抽象)。通過將其擴展到MapHelper,您可以減少重複次數,並且防止您不得不與鑽石操作員混淆在一起。

爲A類更好的名字會是這樣描述的基本地圖類型是什麼(沒有太具體的):

public class StringMapHelper extends HashMap<String, Object> 

如果你這樣做的,類名仍然是描述性的,即使您最終更改了關鍵數據類型,並且您不必在代碼中的任何位置更換密鑰類型:

public class StringMapHelper extends HashMap<FancyString, Object> 
相關問題