今天有人告诉我在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循环不是一个好习惯。有人能给我一笔费用吗?
答案 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
)。就个人而言,我认为坚持这一规则会产生难以阅读的代码。在你的例子中,一旦你找到你想要的东西,立即返回它,它是清楚的,它是有效的。
对函数进行单一输入和单一退出的最初意义在于,它是StructuredProgramming的原始定义的一部分,而不是无纪律的goto SpaghettiCode,并允许在此基础上进行清晰的数学分析。
既然结构化编程早已赢得了胜利,那么没有人会特别关注这一点,本页的其余部分主要是关于最佳实践和美学等,而不是结构化编程结构的数学分析。
答案 4 :(得分:1)
在这两种情况下,代码都是有效的(即,将编译和执行)。
我在Uni的一位讲师告诉我们,不希望在任何循环中continue
,return
语句 - for
或while
。这样做的原因是,在检查代码时,并不是立即清楚是否将执行循环的全长或return
或continue
是否生效。
有关示例,请参阅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;
}