2014-06-05 45 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使用的所有协作对象。这是关于好/更好的设计。它也使你的代码更脆弱。 –