40

今天,有人问我return在 Java 中对关键字的不当使用。我编写了一个简单的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 循环不是一个好习惯。有人可以给我一个解释吗?

4

6 回答 6

80

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

这是不正确的,并且建议您应该以一定程度的怀疑态度对待该人的其他建议。

“只有一个返回语句”(或更一般地说,只有一个退出点)的口头禅在您必须自己管理所有资源的语言中重要 - 这样您就可以确保将所有清理代码放在一个地方。

它在 Java 中的用处要小得多:一旦您知道应该返回(以及返回值应该是什么),就返回。这样一来,阅读起来就更简单了——您不必考虑该方法的任何其余部分来计算还会发生什么(除了finally块)。

于 2012-05-29T13:37:42.623 回答
10

现在有人告诉我,这不是很好的编程,因为我在循环中使用 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;
于 2012-05-29T13:35:48.290 回答
4

所有语言中都有一些方法论提倡在任何函数中使用单个 return 语句。然而,在某些代码中它可能是不可能的,有些人确实为此而努力,然而,它最终可能会使您的代码更复杂(如在更多代码行中),但另一方面,更容易遵循(如在逻辑中)流动)。

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

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

boolean flag = false;
for(int i=0; i<array.length; ++i){
    if(array[i] == valueToFind) {
        flag = true;
        break;
    }
}
return flag;
于 2012-05-29T13:36:19.707 回答
3

有些人认为一个方法应该有一个单一的出口点(例如,只有一个return)。就个人而言,我认为试图遵守该规则会产生更难阅读的代码。在你的例子中,一旦你找到你要找的东西,立即返回,它很清楚而且很有效。

引用 C2 维基:

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

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

于 2012-05-29T13:38:18.503 回答
2

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

continue我在 Uni 的一位讲师告诉我们,return在任何循环中包含语句是不可取的-forwhile。这样做的原因是,在检查代码时,并不能立即清楚循环的全长是执行还是returnorcontinue生效。

请参阅为什么在循环内继续是一个坏主意?例如。

要记住的关键点是,对于像这样的简单场景(IMO)并不重要,但是当您有复杂的逻辑确定返回值时,如果您有一个单独的 return 语句而不是一些。

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

于 2012-05-29T13:40:33.697 回答
2

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

for(int i=0; i<array.length; ++i){
    if(array[i] == valueToFind)
        return true;
}
于 2020-10-16T05:44:57.167 回答