我希望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语句。我该如何做到这一点?
答案 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和转换。