为什么Java允许在任意语句上使用带标签的中断?

2022-09-04 01:39:58

我今天才知道,下面的Java代码是完全合法的:

myBlock: {
    /* ... code ... */

    if (doneExecutingThisBlock())
        break myBlock;

    /* ... more code ... */
}

请注意,这不是一个循环 - 它只是我用大括号分隔的一个代码块。myBlock

这似乎是一个相当奇怪的功能。这意味着您可以使用 named to breakout 语句或匿名块,尽管您通常不能在这些上下文中使用语句。breakifbreak

我的问题是:这个设计决策有充分的理由吗?也就是说,为什么要这样做,以便您只能使用带标签的s而不是常规s来打破某些封闭语句?为什么要允许这种行为呢?考虑到Java作为一种语言是如何(相对)精心设计的,我认为这是有原因的,但老实说,我想不出一个。breakbreak


答案 1

这样做可能只是为了简单起见。如果最初标记的 break 只能中断循环语句,那么语言设计人员应该立即清楚,限制不是必需的,语义对所有语句的工作方式相同。为了语言规范的经济性,以及编译器的更简单实现,或者只是出于通用性的习惯,为任何语句定义了标记的中断,而不仅仅是循环语句。

现在我们可以回顾并判断这个选择。它是否通过赋予程序员额外的表达能力而使他们受益?似乎很少,该功能很少使用。它是否需要程序员在学习和理解方面付出代价?似乎如此,正如这次讨论所证明的那样。

如果你能回到过去并改变它,你会吗?我不能说我会。我们有一种对普遍性的迷恋。

如果在一个平行宇宙中,它仅限于循环语句,那么仍然有一个机会,可能要小得多,有人在stackoverflow上发布问题:为什么它不能在任意语句上工作?


答案 2

可以将其视为从块而不是从整个函数返回的语句。你应用于对象的相同推理可以应用于除函数末尾以外的任何位置。returnbreakreturn