2014-02-26 84 views
1

我正在做一些xml文件的手动反序列化。我需要将xml文件中的所有值(即字符串)转换为适当的类型。自动将字符串转换为动态确定的类型?

我对通过反射在我对象的XML标记的名称相匹配的Field得到适当的类型。

现在,我使用的代码是有点丑:

Field matchedField = getMatchingField(getNodeName(node)); 
Class<?> type = matchedField.getType(); 

if (Integer.class.isAssignableFrom(type)) 
{ 
    return Integer.parseInt(parseNode(node)); 
} 
else if (Double.class.isAssignableFrom(type)) 
{ 
    return Double.parseDouble(parseNode(node)); 
} 
else if // ... etc for all the types I am using 

是否有办法来自动完成这一过程?例如:

return ConvertToType(type, parseNode(node)); 

看来C#有这样的东西,Java有类似的工具吗?

这不是必须对自定义类型进行扩展。我可以手动进行自定义类型的转换。

回答

1

我不知道是否有内置设施,但通过使用接口和映射将类型映射到转换器的映射,您完全可以避免if这样的链条。

下面的代码设置了地图:

// This interface defines the conversion method 
interface Converter { 
    Object fromString(String s); 
} 
// This map has one converter per supported class 
static final Map<Class,Converter> mapper = new HashMap<Class,Converter>(); 
static { 
    mapper.put(Integer.class, new Converter() { 
     public Object fromString(String s) { 
      return Integer.parseInt(s); 
     } 
    }); 
    mapper.put(Double.class, new Converter() { 
     public Object fromString(String s) { 
      return Double.parseDouble(s); 
     } 
    }); 
} 

一旦地图设置,你可以做转换是这样的:

int x = (int)mapper.get(Integer.class).fromString("123"); 
double y = (double)mapper.get(Double.class).fromString("1.23"); 

Here is a demo on ideone.