Java编码标准/最佳实践 – 中断/继续标签的命名约定

有时标记的中断或继续可以使代码更具可读性。

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代码风格似乎更喜欢以与变量相同的方式命名标签,这意味着驼峰大小写的第一个字母。

我最常见的惯例是简单的骆驼案例,就像一个方法名称……

 myLabel: 

但我也看过以下划线为前缀的标签

 _myLabel: 

或与实验室…

 labSomething: 

你可以从其他答案中感觉到,你会很难找到一个除了“不要使用标签”之外的其他任何东西的编码标准。 我猜的答案是,你应该使用任何对你有意义的风格,只要它是一致的。

wrt sadie的代码示例 :

你给了

 outerloop: for (...) { // some code for (...) { // some code if (...) continue outerloop; // more code } // more code } 

举个例子。 你说的对。 我最好的猜测是:

 public void lookMumNoLabels() { for (...) { // some code doMoreInnerCodeLogic(...); } } private void doMoreInnerCodeLogic(...) { for (...) { // some code if (...) return; } } 

但是会有一些例子表明,无论你正在做什么逻辑,这种重构都不能正确地进行。

由于标签很少有用,似乎没有明确的惯例。 Java语言规范有一个标签示例,它们位于non_cap中。

但是,由于它们是如此罕见,我认为最好是三思而后行是否真的是正确的工具。

如果它们是正确的工具,那么让它们全部上限,以便其他开发人员(或者您自己以后)立刻意识到它们是不寻常的。 (正如克雷格已经指出的那样)

对话/最佳实践仍然不会使用它们并重构代码,以便使用extract作为方法更具可读性。

它们是Java的焦点 – 不确定C#是否有它们。 我从来没有在实践中使用它们,我无法想到避免它们不会导致代码更易读的情况。

但如果你必须 – 我认为所有的上限都可以。 大多数人不会使用带标签的断点,因此当他们看到代码时,大写字母会跳出来并迫使他们意识到正在发生的事情。

我知道,我不应该使用标签。

但是假设我有一些代码可以从标记的中断中获得很多可读性,我该如何格式化它们。

莫,你的前提是错的。 问题不应该是“我如何格式化它们?”

你的问题应该是’我的代码在循环中有大量的逻辑 – 我如何使它更具可读性?’

这个问题的答案是将代码移动到单独的,命名良好的函数中。 然后你根本不需要标记断点。