2

我正在将 XML 读入 JAXB pojos,并希望将字段合并到我的实体 pojos。但是,如果 XML 中的值为 null(即 XML 中不存在该值),我不想覆盖现有值。所以现在我有很长的代码集是这样的:

        if (addressDetails.getNAME1() != null) {
            org.setName1(addressDetails.getNAME1());
        }
        if (addressDetails.getNAME2() != null) {
            org.setName2(addressDetails.getNAME2());
        }
        if (addressDetails.getNAME3() != null) {
            org.setName3(addressDetails.getNAME3());
        }

这是丑陋、嘈杂和声纳对圈复杂性的尖叫。你会怎么做呢?想到的事情:

  • util 使用反射(速度慢且类型不安全)
  • 包装类到实体类(详细,样板)

我的目标是可读且没有大量额外代码的东西。

4

3 回答 3

1

看看 Google 的 Guava 代码库。它有一些处理空值的实用方法。

于 2013-02-07T10:59:57.920 回答
0

这是一个基于 Spring 的BeanUtils 类的灵活但缓慢的解决方案

PropertyDescriptor[] descriptors = getPropertyDescriptors(YourSourceClass.class);
List<String> ignoredProperties = new ArrayList<String>();
for(PropertyDescriptor pd : descriptors){
    if(pd.getReadMethod().invoke(yourSourceObject) == null){
        ignoredProperties.add(pg.getBaseName());
    }   
}

BeanUtils.copyProperties(yourSourceObject, yourTargetObject, ignoredProperties.toArray());

它无需为您可能想要设置的每个字段编写显式的 null 检查、getter 和 setter。

如果你想避免反射,你可以缩短这个结构:

if (addressDetails.getNAME3() != null) {
        org.setName3(addressDetails.getNAME3());
}

使用像番石榴这样的实用方法Objects.firstNonNull

 org.setName3(Objects.firstNonNull(addressDetails.getNAME3(), org.getName3()));

这不会帮助您避免为每个属性编写一行,但无论如何它会大大缩短代码。

于 2013-02-07T11:19:18.313 回答
-1

我建议使用反射(当然通过 BeanUils 类库),它可以巧妙地完成这项工作。

于 2013-02-07T10:34:07.047 回答