2012-09-30 46 views
0

我想讓Map對象包含特定的值類型。帶自定義值對象的地圖

Map<String,Object> foo = new HashMap<String,Object>(); 
foo.put("1",new Integer(1)); 
foo.put("2", new String("hello"): 
for (Map.Entry<Integer, Integer> entry : foo.entrySet()) { 
    if(entry.getValue() instanceof String) { 
    //do something 
    } 
    else if(entry.getValue() instanceof Double) { 
     //throw Exception 
    } 
} 

你可以看到我想要完成的。我需要特定的值類型在我的地圖對象,所以我不必把大量的if/else語句。我如何做到這一點?

+1

然後,您將爲每個地圖創建不同的地圖。您不能將'Integer'和'String'放在同一個Map中,而不會將地圖概括爲Object類型。 –

+0

使用幾張地圖。或者使用所有值類型通用的接口。請注意,'new String(「hello」)'沒有多大意義。只需使用「你好」。 –

+0

你可以使用'case'語句... – SomeKittens

回答

3

如果你不喜歡有多個地圖的想法,你可以使用稱爲的好的OOP功能覆蓋。 有關更多信息,請參見Override Methods

我可能會使用組合模式來包裝值類型,然後根據值類型定義一個操作接口。

public abstract class ValueType { 

    public abstract void valueSpecificAction(); 
} 

public class DoubleValueType extends ValueType { 

    private Double value; 

    public DoubleValueType(Double value) { 
      this.value = value; 
    } 

    public void valueSpecificAction() { 
     //do double specific actions 
    } 
} 

public class StringValueType extends ValueType { 

    private String value; 


    public void valueSpecificAction() { 
     //do string specific actions 


    } 
} 

然後,您可以在地圖上添加類型的ValueType的對象。

Map<String,ValueType> foo = new HashMap<String,ValueType>(); 
foo.put("key1", new DoubleValueType(42.0)); 

後,你可以得到價值,這與公共方法valueSpecificAction()裏面做取決於特定類型的東西類型的值類型。

+1

什麼是「覆蓋方法」?你的意思是壓倒性的嗎? –

+0

嗯你是對的,我會在右邊拼寫 –

+0

的帖子中編輯這個,這樣至少可以消除那些無法插入到地圖中的數據類型。謝謝。快速提問。由於我沒有使用庫,我很好奇,看看我應該如何處理Date對象,Datetime和時間對象類? –

0

我不明白你如何避免有一個if-else的地方。

Jan的解決方案只會在計算時確定值類型時纔會使用if-else。在上面的玩具例子中就是這種情況,但是在你的實際問題中是這樣嗎?

如果是讓代碼看起來更乾淨的問題,您總是可以將if-else和轉換隱藏在一組私有方法中。