为什么Java允许在任意语句上标记中断?

tem*_*def 13 java language-design break

我今天刚刚了解到以下Java代码是完全合法的:

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

    if (doneExecutingThisBlock())
        break myBlock;

    /* ... more code ... */
}
Run Code Online (Sandbox Code Playgroud)

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

这似乎是一个相当奇怪的特征.这意味着您可以使用命名break来突破if语句或匿名块,但通常不能break在这些上下文中使用语句.

我的问题是:这个设计决定有充分的理由吗? 也就是说,为什么要这样做,你只能使用标记的breaks而不是常规的breaks 来突破某些封闭的语句?为什么要允许这种行为呢?鉴于(相对)精心设计的Java如何作为一种语言,我认为这是有原因的,但老实说,我想不出一个.

irr*_*ble 10

这样做是为了简单起见.如果最初标记的中断只能破坏循环语句,那么语言设计者应该立即明白限制是不必要的,语义对所有语句都是一样的.对于语言规范的经济性,编译器的简单实现,或者只是出于普遍性的习惯,为任何语句定义标记的break,而不仅仅是循环语句.

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

如果你能回去改变它,是吗?我不能说我愿意.我们对一般性有一种迷恋.

如果在并行Universe中它仅限于循环语句,那么有人可能会在stackoverflow上发布问题,这可能要小得多:为什么它不能用于任意语句?