【问题标题】:Can java labels be used appropriately outside of for loops?java标签可以在for循环之外适当使用吗?
【发布时间】:2013-05-09 10:55:58
【问题描述】:

所以我已经看到很多情况下,标签被用于 for 循环中以中断,尤其是在双重嵌套循环中。

这是唯一可以使用它们的情况吗?或者还有其他我不知道的常见用途。我觉得它是一个我从未使用过的java工具!

【问题讨论】:

  • 由于编程语言滥用goto 语句的历史,它的使用非常谨慎,这可能导致“意大利面条”代码,即难以遵循且无法调试的代码。
  • 恕我直言标签显示了使用它们的开发人员的糟糕设计和懒惰。应不惜一切代价避免它们,特别是由于 HFOE 所述的所有原因
  • Goto 在 Java 中不起作用。也许他们会在 Java 10 中添加它,以纪念 Dijkstra。
  • 那么除了for循环之外,它们没有用吗?即使那样我可能也不应该使用?
  • 在几十年的编程(Java 中的几年)中,我可以用一只手来计算我看到正确使用标签的次数。在 Java 中,它们都与打破循环有关。即便如此,它们也让我呻吟,我相信如果没有它们,代码会更干净(更容易调试和阅读),只要我有时间清理它(删除它们)。它们可以在任何地方使用,但它们会使调试变得困难,并且每次使用一只小猫都会杀死 5 只小猫。 ;)

标签: java for-loop label


【解决方案1】:

公平地说,标记循环是唯一有用可以使用标记语句的方式。

可以在 Java 中标记任何语句,但使用它们的唯一方法是作为(标记的)breakcontinue 语句的目标。

但通常的建议仍然适用:仅仅因为您可以做某事并不意味着您应该这样做。不要将标签用作有趣的“cmets”(是的,我已经看到这样做了)。不要仅仅为了炫耀你打破或继续外循环的能力而编写双重嵌套循环。这些天来,我们倾向于支持应用于整个序列的操作,减少标记breaks 和continues 的一些用途。与往常一样,以可读性和简单性为目标。也就是说,输出 Java 源代码的解析器生成器等工具很可能会大量使用标记语句,即使人类程序员很少这样做。

【讨论】:

  • 所以它对代码生成更有用吗?我只是想知道为什么我错过了一个有用的 java 工具,但听起来我是对的,只是没有对它们做任何事情!
  • 这很公平。在某些情况下,您可以使用它们;经典的例子可能是鲁宾的“在包含全零的矩阵中找到第一行”。在这里,当您扫描一行中的项目时,当您找到一个非零元素时,您将继续您已标记的外循环。恕我直言是可以接受的用途;也许有点做作,但它给了你这个想法。在函数式编程语言中,我们有像 everysomemapfilter 这样的高阶运算符,所以这些类型的东西更容易编写。但在 Java 中,偶尔一次,恕我直言。
【解决方案2】:

带标签的 break 和 continue 本质上是 goto 语句。

来自https://stackoverflow.com/a/6373262/895245:转发转到:

label: {
  // do stuff
  if (check) break label;
  // do more stuff
}

向后跳转

label: do {
  // do stuff
  if (check) continue label;
  // do more stuff
  break label;
} while(true);

所以这个问题归结为关于 goto 语句何时合法的永无止境的争论,例如:Examples of good gotos in C or C++,另外一个事实是,上面的向后 goto 成语甚至比直接 GOTO 更难看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-05
    • 2010-11-14
    • 1970-01-01
    • 2010-10-20
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多