出于代码质量的原因,我想稍微重构一下我的代码,以便在我的循环中只使用一个break
语句。但我不确定我能按照SonarQube的方式做到这一点......
这是我的代码:
for (Integer integer: integerKey.keySet()) {
if (map.containsKey(integerKey.get(integer))) {
TypeValue value = map.get(integerKey.get(integer));
sb.append(integerKey.get(integer)).append(":");
sb.append(encodeValue(value));
sb.append("|");
if (integerKey.get(integer).equals(min)) {
break;
}
} else if (integerKey.get(integer) <= min){
TypeValue value = map.get(min);
sb.append(min).append(":");
sb.append(encodeValue(value));
sb.append("|");
break;
} else {
sb.append(integerKey.get(integer)).append(":");
sb.append("0");
sb.append("|");
}
}
我想做同样的事情,但只使用一个break
,但我不确定在这种情况下我只能写一个if
条件而不是if-elseif-else
。
有什么想法吗?
感谢。
答案 0 :(得分:3)
您可以为break-condition定义一个变量,并将其包含在for循环条件中:
boolean endLoop = false;
for (Iterator<Integer> keys = integerKey.keySet(); keys.hasNext() && !endLoop; ) {
Integer integer = keys.next();
if (map.containsKey(integerKey.get(integer))) {
...
if (integerKey.get(integer).equals(min)) {
endLoop = true;
}
} else if (integerKey.get(integer) <= min){
...
endLoop = true;
} else {
...
}
}
或在循环中声明一个局部变量,如果循环应该中断,则设置为true:
for (Integer integer: integerKey.keySet()) {
boolean endLoop = false;
if (map.containsKey(integerKey.get(integer))) {
...
if (integerKey.get(integer).equals(min)) {
endLoop = true;
}
} else if (integerKey.get(integer) <= min){
...
endLoop = true;
} else {
...
}
if (endloop)
break;
}
答案 1 :(得分:0)
如果你只想使用一个中断,那么你可以设置一个布尔变量并在循环结束时测试它。
答案 2 :(得分:0)
@ hacks4life,你选择的答案绝对是你要求的答案,但它不是你应该从#34中获得的答案;提高代码的质量&#34;观点(毕竟,你确实在你的问题中添加了SonarQube标签,这意味着你对代码质量感兴趣)。
您的代码段和所选答案中的代码片段既不易读取也不易维护。主要的原因是几个代码逻辑相互混合(aka。Spaghetti_code)。
如果您可以从字符串连接逻辑中拆分退出条件,那么问题将是无关紧要的,并且您的代码将更容易维护,并且既没有多个break语句也没有可变控制流变量(两者都是代码味道)。 / p>