2014-06-05 72 views
0

我已經在基於Spring框架的一些網絡項目的工作,我總能找到病因複雜程度相同PMD/Checkstyle的問題:(下面一個簡單的例子:繁瑣結帳(解決方案與Spring)

我們定義父類。

public Class ObjectA(){ 
    private ObjectB objectB; 

    public ObjectB getObjectB(){ 
     return objectB; 
    } 
} 

其次,我們定義的子類。

public Class ObjectB(){ 
    private String str; 

    public String getStr(){ 
     return str; 
    } 
} 

現在,我從一個對象A獲得字符串的「海峽」的值,只有當不爲空,但我必須CH eck所有對象都不是空值。

首個解決方案(4個條件)

if(objectA != null 
     && objectA.getObjectB() != null 
     && objectA.getObjectB().getStr() != null 
     && !objectA.getObjectB().getStr().isEmpty()){ 
     // Do something... 
    } 

與StringUtils的第二類解決方案從春季(3個條件)

if(objectA != null 
     && objectA.getObjectB() != null 
     && StringUtils.hasText(objectA.getObjectB().getStr())){ 
     // Do something... 
    } 

我想知道,如果存在於Spring中的一些方法,對象A以檢查對象B不爲null,並且該方法必須檢查ObjectA是否也不爲null。

謝謝!

回答

2

這是所有關於封裝基本上鍊的getter是一個反模式(恕我直言)

您應該將其中的一部分封裝在ObjectA中,您應該提供一個getstr方法並刪除getObjectB()方法。

public class ObjectA { 
    private ObjectB objectB; 


    public String getstr() { 
     return objectB != null ? objectB.getstr() : null; 
    } 
} 

現在你的其他代碼將會是簡單的。

if (objectA != null && StringUtils.hasText(objectA.getstr()) { ... } 
+0

它可能是一個解決方案,但你必須在父類中添加這些方法。我更喜歡一個通用的方法來從A中獲取B,例如一些帶有getObjFromObj(Object target,String fieldName)的類Utils類,並且我想知道Spring中是否存在此實用工具。 – juanhl

+0

這就是OO關於封裝(等等)的內容。 [Demeter法](http://en.wikipedia.org/wiki/Law_of_Demeter)就是這一點。使用ObjectA的對象應該只知道ObjectA,它不應該知道ObjectA使用的所有協作對象。這是關於好/更好的設計。它也使你的代碼更脆弱。 –