我有一种情况,我必须将值从一个对象复制到另一个对象。对于每个字段,复制语句都包含以下剪切的样板代码:
if (a.getC() != null) {
b.setC(a.getC());
}
我看了一眼番石榴Precondition.checkNotNull(...)
,但它仍然会抛出我试图逃避的NPE。
我怎样才能以更自然的方式做到这一点?
答案 0 :(得分:1)
Apache commons-lang3提供了这个:
b.setC(ObjectUtils.defaultIfNull(a.getC(), b.getC()));
但我必须承认,我不确定这是否真的会有所改善。
答案 1 :(得分:1)
您可以使用var args创建一个方法来检查if
语句的所有参数:
public boolean argsNotNull(Object ... objs) {
boolean b = true;
for(Object o : objs) {
if(o == null) {
b = false;
break;
}
}
return b;
}
然后像这样使用它:
if(argsNotNull(a)) {
Object c = a.getC();
if(argsNotNull(b, c)) { // A null 'c' object may be valid here, depends on your logic
b.setC(c);
}
}
由于此方法使用var args,您可以根据需要为其提供尽可能多的args,但它不适用于当前状态的基元。
答案 2 :(得分:0)
b.C 值是否应该准确反映 a.C 中的内容?在这种情况下,如果 a.C 为null,则 b.C 应为null,并且您不需要进行空检查。
否则,要避免使用curley braces,你可以这样做:
b.setC((a.getC() == null) ? b.getC() : a.getC());
这假设b中的getter和setter完全匹配。如果a中的C为null,那么来自 getC()的 setC()实际上什么都不做。