我正在研究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.
如何解决该问题?除了将其保留在单独的方法中,我想不出其他任何想法,这会增加不必要的额外步骤并增加代码行。这个问题还有其他选择吗?
答案 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
}
}