我正在将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());
}
这是丑陋的,嘈杂的,声纳对于圈复杂性的尖叫声。你会怎么做呢?想到的事情:
我的目标是可读性和没有大量额外代码。
答案 0 :(得分:1)
查看Google的Guava代码库。它有一些处理空值的实用方法。
答案 1 :(得分:0)
这是一个基于Spring的BeanUtils class
的灵活但慢解决方案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());
它为您可能想要设置的每个字段编写显式空检查,getter和setter。
如果你想避免反思,你可以缩短这个结构:
if (addressDetails.getNAME3() != null) {
org.setName3(addressDetails.getNAME3());
}
使用像Guava的Objects.firstNonNull
org.setName3(Objects.firstNonNull(addressDetails.getNAME3(), org.getName3()));
这不会帮助您避免为每个属性写一行,但无论如何它都会大大缩短代码。
答案 2 :(得分:-1)
我建议使用Reflection(通过BeanUils种类库),这可以很好地完成这项工作。