减少嵌套循环并提高Java的可读性

时间:2018-07-03 01:49:12

标签: java loops sonarqube

我正在研究Java应用程序。 Sonar抱怨嵌套循环包含三个以上的嵌套循环。

代码:

if(someCondition){
  List<Integer> list = getIds();

  if(list != null){
     for(int id : list){
         String str1 = someObject.getStr();
         String str2 = someObject.getString();
         if (StringUtils.isBlank(str1)) {
             str1 = NA;
          }
          if (StringUtils.isBlank(str2)) {
              str2 = NA;
           }
        // something else
     }
  }

}

声纳错误:

Refactor this code to not nest more than 3 if/for/while/switch/try statements. 

如何解决该问题?除了将其保留在单独的方法中,我想不出其他任何想法,这会增加不必要的额外步骤并增加代码行。这个问题还有其他选择吗?

3 个答案:

答案 0 :(得分:1)

我认为您的代码嵌套的循环不超过3个,嵌套的 if 则不超过3个。 也许您可以改进永不返回null的getIds()方法,由于某种原因,该方法不应返回null。如果为null,则可以使用return或break结束程序,如:

if(list == null)
  return;

最后,您可以尝试使用三元运算符来确保str1和str2的值。

  String str1 = StringUtils.isBlank(someObject.getStr()) ? NA : someObject.getStr();
  String str2 = StringUtils.isBlank(someObject.getString()) ? NA : someObject.getString();

答案 1 :(得分:0)

您可以执行以下操作:

boolean someConditionIsTrue;
List<Integer> list;

if(someCondition){
    someConditionIsTrue = true;
    list = getIds();
}

if(list != null && someConditionIsTrue){
    for(int id : list){
        String str1 = someObject.getStr();
        String str2 = someObject.getString();
        if (StringUtils.isBlank(str1)) {
            str1 = NA;
        }
        if (StringUtils.isBlank(str2)) {
            str2 = NA;
        }
        //something else
    }
}

但是,它并不那么优雅。

答案 2 :(得分:-1)

简单一点:

    List<Integer> list;
    // Declare the list outside if-condition

    if (someCondition && (list = getIds()) != null) {
    //                   ================   assign it to getId() right inside the condition check

        for (int id : list) {

            // declare same type variables via a comma
            String 
                str1 = obj.getStr(),  
                str2 = obj.getString();

            // get rid of unobligatory {} brackets
            if (StringUtils.isBlank(str1)) str1 = NA;
            if (StringUtils.isBlank(str2)) str2 = NA;

            //something else
        }
    }