Java 循环对半VS重复直到哨兵习语

Java 循环对半VS重复直到哨兵习语,java,computer-science,Java,Computer Science,在大学里,我们学习了两种从控制台读取整数的方法,但并没有给出具体的整数。 第一个是“环半”: 他们说这是一种糟糕的方式,因为代码重复val=readInt(“Enter val:”) 他们还提出了第二种方法“重复直到哨兵成语”: 我有一位老师,他更擅长计算机科学,他总是伤心地说,最好避免在程序中使用(true)和中断,除非有紧急情况,否则不要使用它们,所以我现在有点困惑。 哪种方式被认为是更好的解决方案 第三种解决方案怎么样 boolean keepReading = true; while

在大学里,我们学习了两种从控制台读取整数的方法,但并没有给出具体的整数。 第一个是“环半”:

他们说这是一种糟糕的方式,因为代码重复
val=readInt(“Enter val:”)
他们还提出了第二种方法“重复直到哨兵成语”:

我有一位老师,他更擅长计算机科学,他总是伤心地说,最好避免在程序中使用
(true)
中断
,除非有紧急情况,否则不要使用它们,所以我现在有点困惑。

哪种方式被认为是更好的解决方案

第三种解决方案怎么样

boolean keepReading = true;
while (keepReading) {
    int val = readInt("Enter val");
    if (val == SENTINEL) {
        keepReading = false;
    } 
    else {
        // process the value
    }
}
它与第二个类似,但不使用
while(true)
break
。我真的不喜欢第一个,因为要完成它,你还必须对哨兵重复检查:

int val = readInt(“Enter val:”);
while (val != SENTINEL) 
    val = readInt(“Enter val:”); // duplication
    if (val != SENTINEL) { // duplication
        // process the value 
    }
}

是的,您所说的“半循环”的问题是有一点代码重复。您称之为“重复直到哨兵”的方法不理想的原因是,成语
while(true)
不能很好地表达您的意图。请参阅以获取另一种解释

在您的示例中,您可以

int value;
while ((value = readInt()) != SENTINEL) {
    System.out.println(value);
}
在java中,当您执行赋值操作时,会返回结果,因此您可以在不复制代码的情况下对其进行比较


重要的一点是,它更能表达意图:您可以像读取值不是哨兵一样读取它。

readInt()?您确定您正在使用核心Java库吗?这完全是一个意见问题。你可以阅读支持和反对双方的论点。作为一个基于意见的问题,这个问题被认为是一个离题的问题SO@KickButtowski那与问题无关。
readInt()
的含义很明显,即使假设它是一个自定义方法。@KickButtowski我肯定更喜欢土豆。土豆是老派的,真的:)就我个人而言,我喜欢土豆。有些东西永远不会过时。
int val = readInt(“Enter val:”);
while (val != SENTINEL) 
    val = readInt(“Enter val:”); // duplication
    if (val != SENTINEL) { // duplication
        // process the value 
    }
}
int value;
while ((value = readInt()) != SENTINEL) {
    System.out.println(value);
}