【问题标题】:Tedious Checkout (Solution with Spring)繁琐的结帐(Spring 解决方案)
【发布时间】:2014-06-05 10:31:26
【问题描述】:

我在一些基于 Spring Framework 的 Web 项目中工作过,我总是发现相同的 PMD/Checkstyle 问题导致复杂性级别:(。这里是一个简单的例子:

我们定义父类。

public Class ObjectA(){
    private ObjectB objectB;

    public ObjectB getObjectB(){
         return objectB;
    }
}

第二次我们定义了子类。

public Class ObjectB(){
    private String str;

    public String getStr(){
         return str;
    }
}

现在我从 ObjectA 中得到字符串“str”的值,如果不是空的话,但我必须检查所有对象都不是空值。

第一个解决方案(4 个条件)

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

Spring 中使用 StringUtils 的第二个解决方案(3 个条件)

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

我想知道Spring中是否存在一些方法来检查ObjectA中的ObjectB是否不为null,并且该方法必须检查ObjectA也不为null。

谢谢!!!

【问题讨论】:

    标签: java spring checkstyle pmd


    【解决方案1】:

    这完全是关于封装,基本上链接 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()) { ... }
    

    【讨论】:

    • 这可能是一个解决方案,但您必须在父类中添加这些方法。我更喜欢从 A 获取 B 的通用方法,例如带有这个 getObjFromObj(Object target, String fieldName) 的某个类 Utils 类,我想知道 Spring 中是否存在这个 Utility。
    • 这就是面向对象的封装(以及其他)。 Law of Demeter 就是关于这个的。您使用 ObjectA 的对象应该只知道 ObjectA,它不应该知道 ObjectA 使用的所有协作对象。这是关于好的/更好的设计。它还使您的代码不那么脆弱。
    【解决方案2】:

    您可以使用@NonNull Lombok 的注解跳过空值检查。

    看看这个:

    http://projectlombok.org/features/NonNull.html

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多