2014-04-02 44 views
0

我有一種情況,必須將值從一個對象複製到另一個對象。每個字段的副本語句包裝用以下剪斷的樣板代碼:如何在Java中優雅地處理空值

if (a.getC() != null) { 
    b.setC(a.getC()); 
} 

我看了一下番石榴Precondition.checkNotNull(...),但它仍然拋出一個我想逃避NPE。

我該如何以更自然的方式做到這一點?

+1

它不檢查a或b爲null。 – PlayDeezGames

+1

如果'b.setC'設置的值爲空,是否會出現問題?如果不是,則不需要空檢查。這個代碼拋出NPE的唯一方法是如果'a'或'b'爲空。 – forgivenson

回答

1

阿帕奇公地lang3提供這樣的:

b.setC(ObjectUtils.defaultIfNull(a.getC(), b.getC())); 

但我不得不承認,我不知道這是否真的是一個進步。

+0

,符合我的需求。 非常感謝。 – user2508615

1

你可以使用變參來檢查你的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); 
    } 
} 

由於這種方法使用變參就可以根據需要爲其提供儘可能多的參數,但它不適用於當前狀態下的基元。

+0

這並不能真正解決'null'檢查的問題。它只是將它委託給不同的方法。 – Jeffrey

+0

@Jeffrey OP要求更自然。這並不像Groovy [安全導航操作員](http://groovy.codehaus.org/Operators#Operators-SafeNavigationOperator(?.))那麼好,但它比('a!= null && b!= null && c!= null')或龐大的非特定try/catch塊。 – ubiquibacon

0

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()其實際上什麼都不做。

相關問題