退出Java中的循环

退出Java中的循环,java,coding-style,Java,Coding Style,我正在使用Java,但我想这个问题适用于任何语言。我只是想问,使用我在循环中切换的布尔值退出循环,还是只使用break,这是更好的做法 例如,我刚刚编写了一个方法,以便在国际象棋中为皇后获得有效的移动 private static final int[][] DIRS = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {-1, -1}, {-1, 1}, {1, -1}}; public Vector<Move> getValidMoves(

我正在使用Java,但我想这个问题适用于任何语言。我只是想问,使用我在循环中切换的布尔值退出循环,还是只使用break,这是更好的做法

例如,我刚刚编写了一个方法,以便在国际象棋中为皇后获得有效的移动

private static final int[][] DIRS = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {-1, -1}, {-1, 1}, {1, -1}};

public Vector<Move> getValidMoves() {
    Vector<Move> validMoves = new Vector<Move>();

    for (int i = 0; i < DIRS.length; i++) {
        boolean stopped = false;
        int newX = x + DIRS[i][0];
        int newY = y + DIRS[i][1];
        while (!stopped && newX >= 0 && newX < 8 && newY >= 0 && newY < 8) {
            if (board[newX][newY] == null) {
                validMoves.add(new Move(x, y, newX, newY));
                newX += DIRS[i][0];
                newY += DIRS[i][1];
            } else {
                if (board[newX][newY].getColour() == colour) {
                    stopped = true;
                } else {
                    validMoves.add(new Move(x, y, newX, newY));
                    stopped = true;
                }
            }
        }
    }

    return validMoves;
}
private static final int[]DIRS={{0,1},{0,-1},{1,0},{1,1},{-1,-1},{-1,1},{-1,1},{-1,1},{1,-1};
公共向量getValidMoves(){
向量validMoves=新向量();
对于(int i=0;i=0&&newX<8&&newY>=0&&newY<8){
如果(线路板[newX][newY]==null){
添加(新移动(x,y,newX,newY));
newX+=DIRS[i][0];
newY+=DIRS[i][1];
}否则{
if(board[newX][newY].getcolor()==color){
停止=真;
}否则{
添加(新移动(x,y,newX,newY));
停止=真;
}
}
}
}
返回有效移动;
}

如果我使用break退出while循环;我的理解是,它运行效率更高,但不是最好的代码样式,而不是像我一样将stopped设置为true。

从性能角度看,这无关紧要,您在堆栈上分配了1个布尔值,并在每个循环迭代中添加了1个比较,因此无需担心

这主要取决于您是否希望在退出循环代码之前完成其余循环代码的执行。Break将立即退出,设置布尔值将等待下一次迭代后停止


如果您不需要完成循环迭代,那么如果您使用
break

break
的唯一原因是退出循环,那么您的代码将更易于阅读,我想不出任何更好的方法

我建议你做你认为最清楚的事。对于嵌套循环,使用布尔值的IMHO更清晰,但对于简单循环,使用标志是不必要的冗长

while (0 <= newX && newX < 8 && 0 <= newY && newY < 8) {
    if (board[newX][newY] == null) {
        validMoves.add(new Move(x, y, newX, newY));
        newX += DIRS[i][0];
        newY += DIRS[i][1];
    } else {
        if (board[newX][newY].getColour() != colour) 
            validMoves.add(new Move(x, y, newX, newY));
        break;
    }
}

while(0明确使用break。这就是关键字的作用,它生成更简洁的代码,不会让阅读您的代码的人怀疑“停止”在哪里循环来自,而且可能更快。

取决于你和谁说话。我有一位大学教授,他发誓他会用正常表达式检查枪杀任何没有退出控制结构(如循环)的学生


然而,我已经看到,尽管这可能是“有纪律的”,但有时提前退出循环或其他控制结构是可取的。考虑到这一点,我说“去做”。您仍然可以遵守纪律,拥有可读的代码,这些代码在提前退出时不会出现意外行为(只要退出是离开该结构的有效理由。

这正是语言中存在中断的原因。我会使用它。

就像上面提到的用户一样,一定要使用中断。退出循环就是它的目的。

似乎还没有提到的一点:

在Java中(不是唯一的),退出嵌套循环将比在每一级嵌套相同的条件更加优雅。它还将使代码更易于维护


此外,它还可以使循环的逻辑更加简单,因为一旦出现异常情况,您就可以采取行动,而不是继续执行代码。这也促进了循环体中的模块化。

因为在这里使用布尔变量对性能影响不大,这与可读性有关。有些人认为using break语句降低代码的可读性有两个原因

一个是,当使用break语句时,用户有时无法按顺序读取代码(需要跳转读取)。这可能会造成混淆,因为读者需要确定break语句将下一个操作带到何处

另一件事是,使用变量作为停止条件有助于读者理解,如果您对变量进行了有意义的命名,那么它为什么会停止。例如,如果您使用isEmpty boolean变量作为停止条件,很明显,循环已停止,因为任何内容都是空的


我并不反对使用break语句,但我认为您应该做的是使其尽可能可读。

您可能想从oracle网页上了解break的用法

使用中断退出循环被认为是一种良好的做法。那么是否使用它取决于您自己


<>现在如果你想提高代码的可读性和灵活性,你可以考虑把复杂的循环分解成函数。< /p>因为它损坏了,但是在它被设置之后继续下一次迭代,我想它是。谢谢Johan-SJ席贝格和马文实验室的快速响应。在这种情况下,是的,我会写代码>破解< /代码> I AG。ree.我过去害怕break关键字。出于某种原因,我把它与糟糕的编程风格联系在一起。它看起来很“残忍”,因为它只是“破坏”了循环,如果它“破坏”了循环,那不是很糟糕的设计吗?毕竟一切都应该“流动”。事实证明break是一个非常优雅的解决方案。我花了几年时间才看到:)没错!我一直在中断。如果不需要更复杂的话。我想指出,中断也用于开关^^^为什么你说它可能更快?@davin:在第二次迭代后中断(例如)可以说,它比其他数百次迭代的速度要快……并不是说它会快任何超过0.01秒,但仍然如此。@BoltClock,显然继续无用的迭代比退出要慢(除了检查特定条件本身需要很长时间的极端情况).在我看来,这里的说法是,通常使用
break
比使用布尔表达式退出要快