我经常听说在 Java 中使用 break
被认为是不好的做法,但在阅读了 Stack Overflow 上的一些帖子后,我发现并非如此。许多人说在某些情况下这是可以接受的。
对于在这种情况下什么是/不是坏做法,我有点困惑。
对于 Project Euler : 问题 7,我已经构建了下面的代码。挑战是找到第 10001 个素数。
int index = 2, count = 1, numPrime = 1;
while (true) {
index++;
if (isPrime(index)) {
count = index;
numPrime++;
}
if (numPrime >= 10001)
break;
}
System.out.println(count);
这会返回正确答案(在 21 毫秒内),但我是否忽略了一个严重的警告?创建一个不间断的 while 循环是 100% 可能的,但我发现这更容易理解。
我使用 break;
的方式不好吗?我知道总有办法绕过使用一个,但这里真的有那么糟糕吗?
非常感谢
贾斯蒂安
编辑
这是我的 isPrime() 代码。我不妨在我做的时候优化它。
public static boolean isPrime(long num) {
if (num == 2)
return true;
if (num % 2 == 0 || num <= 0)
return false;
for (long i = 3; i * i <= num; i += 2)
if (num % i == 0)
return false;
return true;
}
最佳答案
我不确定一般情况下 break 是不好的做法,但我认为这个是。
这有点傻,因为它没有必要。您的 while (true) ... break
完全等同于:
while (numPrime < 10001) {
...
}
但不那么直观。
坚持使用规范的方式来表示事物意味着读者的计算开销更少,使您的代码更易于理解,从而更易于维护并最终更健壮。
编辑(回应评论):你是对的,总有一种方法可以使用,但规则(如果你想要的话)相对简单:写任何最易读的东西。在您发布的情况下,这不是最具可读性的,因为我给出的替代方案是表示这一点的规范方式。在某些情况下,例如循环遍历集合直到找到匹配的特定候选项,使用 break
可能 是表示此模式的最合适方式。
关于何时使用 break
以及何时提取变量并改为使用条件语句,很难(我会争辩说,徒劳无功)尝试提出硬性规定。通常很容易分辨什么是最简单的选择,但并非总是如此。这是经验非常重要的例子之一——你自己阅读和编写的好代码/坏代码越多,你的好例子和坏例子的个人图书馆就越大,你就越容易分辨出什么是“最好的” "* 表示给定概念的方法是。
*当然是主观的!
关于java - 我听说有些 "break"不是坏习惯。这个如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3373305/