为什么增强 for 循环的局部变量必须是局部的? [复制]

2023-12-27

根据Java 语言规范,第 14.14.2 节 http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14.2,增强的变量for循环必须是循环的本地循环。换句话说,这可以编译:

for (State state : State.values()) {
    // do something for each state
}

但这并没有:

State state;
for (state: State.values()) {
    // do something for each state
}

JLS 没有给出这种语言设计选择的理由。我可以明白为什么如果局部变量被修改,类型名称必须存在final或通过注释,但我不明白为什么不允许在其他地方声明的变量的裸名称。有谁知道为什么要施加此限制?

EDIT

到目前为止,几个答案似乎表明循环之外发生的事情是以这种方式设计语言的原因。也许仔细研究一下 JLS 的说法会澄清为什么我认为这不令人信服。考虑这个循环,其中State是一个枚举:

for (State state : State.values()) {
    // ...
}

State.values()是一个数组,因此根据 JLS,该循环在功能上与以下相同:

State[] a = State.values();
for (int i = 0; i < a.length; i++) {
    State state = a[i];
    // ...
}

现在显然可以编写后一个循环:

State state;
State[] a = State.values();
for (int i = 0; i < a.length; i++) {
    state = a[i];
    // ...
}

从概念上讲,最后一个(完全合法)循环可以用作第二个增强循环的功能等效项for上面的循环(无法编译的循环)。

同样,如果stateList is an Iterable<State>(不是数组),这个循环:

for (State state : stateList) {
    // ...
}

功能上与以下相同:

for (Iterator<State> iterator = stateList.iterator(); iterator.hasNext(); ) {
    State state = iterator.next();
    // ...
}

和之前一样,后一个循环 可以写成:

State state;
for (Iterator<State> iterator = stateList.iterator(); iterator.hasNext(); ) {
    state = iterator.next();
    // ...
}

再说一遍,这个could已被用作(非法)的功能等同物:

State state;
for (state : stateList) {
    // ...
}

在每种情况下,当循环退出时,值state是完全明确定义的(如果,也许,无用的话)。此外,就像常规循环一样,增强型for使用未定义的裸变量名进行循环(例如,行State state;丢失或超出范围)可以在编译时捕获。那么从语言设计的角度来看,问题出在哪里呢?为什么语言设计者禁止这种构造?


看看 for-each 循环内部是如何工作的,参见Java 的“foreach”循环是如何工作的? https://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work

for(Iterator<String> i = someList.iterator(); i.hasNext(); ) {
String item = i.next();
System.out.println(item);
}

每次它都声明 String 变量 item。因此,在你的情况下,它本质上是在做

State state;
\\and inside
State state = i.next();

这显然行不通。现在在实现中,他们只能做

item = i.next();

但是你总是必须在 for-each 之外定义该项目,这在大多数情况下会很痛苦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么增强 for 循环的局部变量必须是局部的? [复制] 的相关文章

随机推荐