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
    }
}

你可以看到我想要完成的事情。我需要在我的 Map 对象中使用特定的值类型,因此我不必放置大量 if/else 语句。我如何做到这一点?

4

2 回答 2

3

如果您不喜欢拥有多个地图的想法,您可以使用称为覆盖的 OOP 功能。有关详细信息,请参阅覆盖方法

我可能会使用组合模式来包装值类型,然后根据值类型为操作定义一个接口。

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(),它根据特定类型执行这些操作。

于 2012-09-30T20:38:29.597 回答
0

我不明白如何避免在某个地方出现 if-else。

仅当值类型可以在计算时确定时,Jan 的解决方案才会为您节省 if-else。上面的玩具示例就是这种情况,但在您的实际问题中是否如此?

如果是为了让代码看起来更干净,你总是可以在一组私有方法中隐藏 if-else 和转换。

于 2012-09-30T23:32:48.653 回答