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