gpt4 book ai didi

java - 为什么增强的 for 循环的局部变量必须是局部变量?

转载 作者:IT老高 更新时间:2023-10-28 21:01:24 24 4
gpt4 key购买 nike

根据Java Language Specification, § 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 修改,我可以看到为什么必须存在类型名称或通过注释,但我不明白为什么不允许在其他地方声明的变量的裸名。有没有人知道为什么要施加这种限制?

编辑

到目前为止,一些答案似乎表明循环之外发生的事情是以这种方式设计语言的原因。也许对 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 的功能等价物。上面的循环(不编译的那个)。

同样,如果 stateListIterable<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();
// ...
}

同样,这个可以被用作(非法)的功能等价物:

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

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

最佳答案

查看 for-each 循环内部的工作原理,参见 How does the Java 'for each' loop work?

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

每次它声明字符串变量项。因此,在您的情况下,它实际上是在做

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

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

item = i.next();

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

关于java - 为什么增强的 for 循环的局部变量必须是局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8204341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com