2012-05-29 96 views
20

今天有人在Java中使用了return关键字。我写了一个简单的for循环来验证某个数组中的东西。假设array是长度的数组n,这是我的代码:返回for循环或外部循环

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; 

问题是,我不能想出一个适当的补充,为什么第一个循环不是一个好的做法。有人可以给我一个费用吗?

+0

那个人究竟做了什么,作为第一个不好的原因?与GC打交道? – Poindexter

+7

如果GC发生故障,这是JVM的问题,而不是您的程序...您的代码完全有效。 –

+0

“这会导致垃圾回收失灵”:您能详细说明吗? – assylias

回答

47

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

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

的“只有一个return语句”(或更一般,只有一个出口点)是,你必须自己管理所有资源语言重要的口头禅 - 这样你可以确保你把你所有的清理工作代码在一个地方。在Java中它非常有用:只要你知道你应该返回(以及返回值应该是什么),只需返回。通过这种方式阅读起来更简单 - 您不必采用其余任何方法来计算还会发生什么(除finally块之外)。

+4

单个return语句是我以前工作的代码约定的一部分。我发现它导致大量的嵌套,并且更难以阅读代码。 – brain

+2

@brain:确实。这通常是人们在不理解*理由的情况下接受一个想法的结果*为什么在某种情况下它是一个好主意。 –

+1

在出现异常情况下,单个退出只是不可行的,因为几乎任何非平凡的代码都可能引发一个退出。最好在这里使用语言流,而不是强迫代码根据某些在不同环境/语言中可能有意义的规则行事。 –

6

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

这是一堆垃圾。除非在课堂或其他地方有其他参考资料(封装很重要的原因),否则方法内的所有内容都将被清除。作为一个经验法则,使用一个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; 
+5

梅;编写最易读的代码通常会更好,无论这意味着多少返回语句。例如,如果您有一堆警戒条款,则每个(IMO)在发生故障时应立即返回。 –

+0

作为一个方面说明,在这种方法中没有GC,因为这里没有对象分配。 –

+0

肯定与戴夫同意 - 我不明白为什么“方法将退出”本身是重要的。重要的是你可以轻松地遵循该方法的逻辑。 –

3

已经有方法。然而,在某些代码中可能是不可能的,但有些人确实为此付出了努力,但最终可能会使代码更加复杂(如更多代码行),但另一方面更容易遵循(如逻辑流)。

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

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

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

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

Quoting the C2 wiki:

具有用于功能的单一入口和单一出口的原始意义在于,它是StructuredProgramming的原始定义的一部分,而不是散漫转到面条式代码,并允许在一个干净的数学分析这个基础。

既然结构化编程早已胜出,那么现在没有人会特别关心这个问题,而其余的网页主要是关于最佳实践和美学等,而不是关于结构化编程结构的数学分析。

1

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

我的一位在大学的讲师告诉我们,这是不希望有任何循环continuereturn报表 - forwhile。原因在于,在检查代码时,不能立即清楚执行循环的全部长度,还是要求returncontinue生效。

查看Why is continue inside a loop a bad idea?举例。

需要记住的一点是,对于像这样的简单场景,它不会(IMO)问题,但是当你有复杂的逻辑来确定返回值时,如果你有一个单一的返回语句而不是几个。

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