Mo.*_*Mo. 20 java convention label
有时标记的中断或继续可以使代码更具可读性.
OUTERLOOP: for ( ;/*stuff*/; ) {
//...lots of code
if ( isEnough() ) break OUTERLOOP;
//...more code
}
Run Code Online (Sandbox Code Playgroud)
我想知道标签的常见惯例是什么.全部大写?第一次上限?
Mar*_*ing 35
我不明白这个"不使用标签"的规则来自哪里.在执行非平凡的循环逻辑时,断开或继续的测试并不总是整齐地位于周围块的末尾.
outer_loop:
for (...) {
// some code
for (...) {
// some code
if (...)
continue outer_loop;
// more code
}
// more code
}
Run Code Online (Sandbox Code Playgroud)
是的,像这样的案件确实一直在发生.人们建议我使用什么呢?像这样的布尔条件?
for (...) {
// some code
boolean continueOuterLoop = false;
for (...) {
// some code
if (...) {
continueOuterLoop = true;
break;
}
// more code
}
if (continueOuterLoop)
continue;
// more code
}
Run Code Online (Sandbox Code Playgroud)
呸! 将其重构为一种方法并不能减轻这种情况:
boolean innerLoop (...) {
for (...) {
// some code
if (...) {
return true;
}
// more code
}
return false;
}
for (...) {
// some code
if (innerLoop(...))
continue;
// more code
}
Run Code Online (Sandbox Code Playgroud)
当然它有点漂亮,但它仍然传递一个多余的布尔值.如果内部循环修改了局部变量,那么将其重构为方法并不总是正确的解决方案.
那么为什么你们都反对标签呢?给我一些坚实的理由,以及上述案例的实际替代方案.
Cra*_*aig 16
如果你必须使用它们使用大写字母,这会引起对它们的注意,并将它们单独错误地解释为"类"名称.引起对它们的关注还有一个额外的好处,就是能够抓住某个人的眼睛并重构你的代码并删除它们.;)
Rod*_*own 14
惯例是完全避免标签.
使用标签打破循环的有效理由非常非常少.突破是可以的,但你可以通过稍微修改你的设计来消除破坏的需要.在您给出的示例中,您将提取"许多代码"部分并将它们放在具有有意义名称的单个方法中.
for ( ;/*stuff*/; )
{
lotsOfCode();
if ( !isEnough() )
{
moreCode();
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:看过有问题的实际代码(在这里),我认为使用标签可能是使代码可读的最佳方式.在大多数情况下使用标签是错误的方法,在这种情况下,我认为它很好.