使用自定义值对象映射

时间:2012-09-30 20:09:01

标签: java

我希望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
    }
}

你可以看到我想要完成的任务。我需要在Map对象中使用特定的Value类型,所以我不需要输入大量的if / else语句。我该如何做到这一点?

2 个答案:

答案 0 :(得分:3)

如果您不喜欢拥有多个地图,可以使用名为覆盖的漂亮OOP功能。 有关详细信息,请参阅Override Methods

我可能会使用 composition 模式来包装值类型,然后根据值类型定义操作的接口。

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));

稍后您可以获取值,其类型为ValueType,其公共方法为 valueSpecificAction(),具体取决于具体类型。

答案 1 :(得分:0)

我看不出你怎么能避免在某些地方有一个if-else。

只有在编制时可以确定值类型时,Jan的解决方案才会省去if-else。在上面的玩具示例中就是这种情况,但在您的实际问题中是这样吗?

如果要使代码看起来更清晰,您可以随时在一组私有方法中隐藏if-else和转换。