返回for循环或外循环

时间:2012-05-29 13:31:15

标签: java for-loop while-loop

今天有人告诉我在Java中使用return关键字。我编写了一个简单的for循环来验证数组中的某些内容。假设array是一个长度为n的数组,这是我的代码:

for(int i=0; i<array.length; ++i){
    if(array[i]==valueToFind) return true;
}
return false;

现在有人告诉我这不是很好的编程,因为我在循环中使用return语句,这会导致垃圾收集出现故障。因此,更好的代码将是:

int i = 0;
while(i<array.length && array[i] != valueToFind) ++i;
return i != array.length;

问题在于我无法正确地阐述为什么第一个for循环不是一个好习惯。有人能给我一笔费用吗?

6 个答案:

答案 0 :(得分:57)

  

现在有人告诉我这不是很好的编程,因为我在循环中使用return语句,这会导致垃圾收集出现故障。

这是不正确的,并建议你应该怀疑地对待那个人的其他建议。

“只有一个退货声明”(或者更一般地,只有一个退出点)的咒语 在您必须自己管理所有资源的语言中非常重要 - 这样您就可以确保将所有清理代码放在一个地方。

它在Java中的用处不大:只要你知道应该返回(以及返回值应该是什么),只需返回即可。这样,它更容易阅读 - 您不必接受任何其他方法来计算将要发生的其他事情(除finally块之外)。

答案 1 :(得分:6)

  

现在有人告诉我这不是很好的节目,因为我   在循环中使用return语句,这会导致垃圾   收集到故障。

那是一堆垃圾。方法中的所有内容都将被清除,除非在类或其他地方有其它引用(封装很重要的原因)。根据经验,通常最好只使用一个return语句,因为它更容易找出方法将退出的位置。

就个人而言,我会写:

Boolean retVal = false;
for(int i=0; i<array.length; ++i){
    if(array[i]==valueToFind) {
        retVal = true;
        break; //Break immediately helps if you are looking through a big array
    }
}
return retVal;

答案 2 :(得分:3)

所有语言都有方法论主张在任何函数中使用单个return语句。不管它在某些代码中是不可能的,有些人确实在努力,但是,最终可能会使代码变得更复杂(如更多代码行),但另一方面,更容易理解(如逻辑中)流动)。

这不会以任何方式搞乱垃圾收集!!

更好的方法是设置一个布尔值,如果你想听他的话。

boolean flag = false;
for(int i=0; i<array.length; ++i){
    if(array[i] == valueToFind) {
        flag = true;
        break;
    }
}
return flag;

答案 3 :(得分:2)

有些人认为方法应该有一个退出点(例如,只有一个return)。就个人而言,我认为坚持这一规则会产生难以阅读的代码。在你的例子中,一旦你找到你想要的东西,立即返回它,它是清楚的,它是有效的。

Quoting the C2 wiki:

  

对函数进行单一输入和单一退出的最初意义在于,它是StructuredProgramming的原始定义的一部分,而不是无纪律的goto SpaghettiCode,并允许在此基础上进行清晰的数学分析。

     

既然结构化编程早已赢得了胜利,那么没有人会特别关注这一点,本页的其余部分主要是关于最佳实践和美学等,而不是结构化编程结构的数学分析。

答案 4 :(得分:1)

在这两种情况下,代码都是有效的(即,将编译和执行)。

我在Uni的一位讲师告诉我们,不希望在任何循环中continuereturn语句 - forwhile。这样做的原因是,在检查代码时,并不是立即清楚是否将执行循环的全长或returncontinue是否生效。

有关示例,请参阅Why is continue inside a loop a bad idea?

要记住的关键点是,对于这样的简单场景,它不会(IMO)重要,但是当您有复杂的逻辑确定返回值时,如果您只有一个返回值,则代码“通常”更具可读性声明而不是几个。

关于垃圾收集 - 我不知道为什么这会是一个问题。

答案 5 :(得分:0)

因为GC没有问题。我喜欢这个。

for(int i=0; i<array.length; ++i){
    if(array[i] == valueToFind)
        return true;
}