我看了一些2001年的旧代码,发现了下面这句话:
else {
do {
int c = XMLDocumentFragmentScannerImpl.this.scanContent();
if (c == 60) {
XMLDocumentFragmentScannerImpl.this.fEntityScanner.scanChar();
XMLDocumentFragmentScannerImpl.this.setScannerState(1);
break label913;
}
我以前从来没有见过这样的情况,并且在这里发现了标记的中断:
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html
这本质上不是像goto
一样工作吗?使用它是一种很好的实践吗?这让我感到不安。
发布于 2013-02-19 22:59:03
它不像goto
那么可怕,因为它只将控制发送到标记语句的末尾(通常是循环结构)。让goto
不讨人喜欢的是,它是一个任意分支,可以到达任何地方,包括方法源代码中更高层的标签,这样您就可以拥有自己的循环行为。Java中的标签中断功能不允许这种疯狂,因为控制只向前移动。
我在大约12年前只使用过一次,在我需要打破嵌套循环的情况下,更结构化的替代方案将在循环中进行更复杂的测试。我不建议经常使用它,但我也不会把它标记为自动的坏代码气味。
发布于 2015-05-24 16:25:04
用新方法替换break
总是有可能的。
考虑对两个列表中的任何公共元素进行代码检查:
List list1, list2;
boolean foundCommonElement = false;
for (Object el : list1) {
if (list2.contains(el)) {
foundCommonElement = true;
break;
}
}
你可以像这样重写它:
boolean haveCommonElement(List list1, List list2) {
for (Object el : list1) {
if (list2.contains(el)) {
return true;
}
}
return false;
}
当然,要检查两个列表之间的公共元素,最好在具有O(n)
额外内存的O(n)
中使用list1.retainAll(new HashSet<>(list2))
方法,或者在O(n * log n)
中对两个列表进行排序,然后在O(n)
中找到公共元素。
发布于 2018-12-17 21:26:32
表达意图的一种更清晰的方式是,至少在我看来,将包含循环的代码片段放入一个单独的方法中,并简单地从该方法中执行return
。
例如,更改以下内容:
someLabel:
for (int j = 0; j < 5; j++)
{
// do something
if ...
break someLabel;
}
如下所示:
private void Foo() {
for (int j = 0; j < 5; j++)
{
// do something
if ...
return;
}
}
对于精通其他语言(或future you)的开发人员来说,这也更适合将来使用您的代码。
https://stackoverflow.com/questions/14960419
复制相似问题