我有一種情況,必須將值從一個對象複製到另一個對象。每個字段的副本語句包裝用以下剪斷的樣板代碼:如何在Java中優雅地處理空值
if (a.getC() != null) {
b.setC(a.getC());
}
我看了一下番石榴Precondition.checkNotNull(...)
,但它仍然拋出一個我想逃避NPE。
我該如何以更自然的方式做到這一點?
我有一種情況,必須將值從一個對象複製到另一個對象。每個字段的副本語句包裝用以下剪斷的樣板代碼:如何在Java中優雅地處理空值
if (a.getC() != null) {
b.setC(a.getC());
}
我看了一下番石榴Precondition.checkNotNull(...)
,但它仍然拋出一個我想逃避NPE。
我該如何以更自然的方式做到這一點?
阿帕奇公地lang3提供這樣的:
b.setC(ObjectUtils.defaultIfNull(a.getC(), b.getC()));
但我不得不承認,我不知道這是否真的是一個進步。
,符合我的需求。 非常感謝。 – user2508615
你可以使用變參來檢查你的if
聲明所有ARGS做的方法:
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);
}
}
由於這種方法使用變參就可以根據需要爲其提供儘可能多的參數,但它不適用於當前狀態下的基元。
這並不能真正解決'null'檢查的問題。它只是將它委託給不同的方法。 – Jeffrey
@Jeffrey OP要求更自然。這並不像Groovy [安全導航操作員](http://groovy.codehaus.org/Operators#Operators-SafeNavigationOperator(?.))那麼好,但它比('a!= null && b!= null && c!= null')或龐大的非特定try/catch塊。 – ubiquibacon
是b.C價值應該準確反映什麼在a.C?在這種情況下,如果a.C爲空,那麼b.C應該爲空,並且您並不真正需要空檢查。
否則,爲避免柯利括號,你可以做這樣的事情:
b.setC((a.getC() == null) ? b.getC() : a.getC());
這是假設從B匹配的getter和setter完全調。如果來自a的C爲空,則setC() from getC()其實際上什麼都不做。
它不檢查a或b爲null。 – PlayDeezGames
如果'b.setC'設置的值爲空,是否會出現問題?如果不是,則不需要空檢查。這個代碼拋出NPE的唯一方法是如果'a'或'b'爲空。 – forgivenson