想改进这个问题吗?更新问题,以便通过编辑这篇文章用事实和引用来回答。
我想知道使用off
语句退出循环而不是满足循环条件是否是一种“不良做法”?
我对Java和JVM没有足够的洞察力来知道如何处理循环,所以我想知道这样做是否忽略了一些关键的事情。
这个问题的重点:是否有特定的性能开销?
当然不是。有时循环中可能会出现一些满足整体要求的事情,而不满足逻辑循环条件。在这种情况下,使用rest
来阻止您毫无意义地循环。
例子
String item;
for(int x = 0; x < 10; x++)
{
// Linear search.
if(array[x].equals("Item I am looking for"))
{
//you've found the item. Let's stop.
item = array[x];
break;
}
}
在这个例子中更有意义的是。即使在你找到它之后,每次都继续循环到10,或者循环直到你找到项目并停止?或者把它放在现实世界中;当你找到你的钥匙时,你会继续寻找吗?
编辑以响应评论
为什么不将x
设置为11
来打破循环?这毫无意义。我们有off
!除非您的代码假设x
以后肯定大于10
(可能不应该),否则您只需使用rest
就可以了。
为了完整起见进行编辑
肯定还有其他方法可以模拟off
。例如,在循环中为您的终止条件添加额外的逻辑。说它要么是无意义的循环,要么使用off
是不公平的。正如所指出的,while循环通常可以实现类似的功能。例如,遵循上面的示例…
while(x < 10 && item == null)
{
if(array[x].equals("Item I am looking for"))
{
item = array[x];
}
x++;
}
使用off
仅仅意味着您可以通过for
循环来实现此功能。这也意味着您不必在希望循环行为不同的时候继续在终止逻辑中添加条件。例如。
for(int x = 0; x < 10; x++)
{
if(array[x].equals("Something that will make me want to cancel"))
{
break;
}
else if(array[x].equals("Something else that will make me want to cancel"))
{
break;
}
else if(array[x].equals("This is what I want"))
{
item = array[x];
}
}
而不是具有如下终止条件的while循环
:
while(x < 10 && !array[x].equals("Something that will make me want to cancel") &&
!array[x].equals("Something else that will make me want to cancel"))
在特定的上下文中,使用rest
,就像使用任何其他语言特性一样,可能是一种不好的做法,在这种上下文中,你显然是在滥用它。但是一些非常重要的习语没有它就无法编码,或者至少会导致代码的可读性大大降低。在这些情况下,rest
是正确的选择。
换句话说,不要听任何笼统的、无条件的建议——关于off
或其他任何东西。我从未见过代码完全瘦弱,只是为了真正执行“良好实践”。
关于您对性能开销的关注,绝对没有。在字节码级别,无论如何都没有显式的循环构造:所有的流控制都是根据条件跳转实现的。
JLS指定中断是循环的异常终止。然而,仅仅因为它被认为是异常的并不意味着它没有在许多不同的代码示例、项目、产品、航天飞机等中使用。JVM规范没有说明存在或不存在性能损失,尽管很明显代码执行将在循环之后继续。
然而,代码易读性可能会受到奇怪中断的影响。如果你在一个复杂的if语句中插入一个中断,周围都是副作用和奇怪的清理代码,可能是一个带有标签的多级中断(或者更糟糕的是,一组奇怪的退出条件一个接一个),那么任何人都不容易阅读。
如果您想通过强制迭代变量在迭代范围之外或通过其他方式引入不一定直接的退出方式来打破循环,它的可读性不如rest
。
然而,以空的方式循环额外的时间几乎总是不好的做法,因为它需要额外的迭代并且可能不清楚。