gpt4 book ai didi

groovy - groovy 是否尊重在闭包或匿名类之外定义的最终变量?

转载 作者:行者123 更新时间:2023-12-04 04:50:48 29 4
gpt4 key购买 nike

今天我在将一些 java 代码移植到 groovy 时发现了一些 groovy 的严重行为。

我们在 java 中一直在做的事情:在循环中构建匿名类(例如,用于操作)并引用在该类之外声明的最终变量。

如果让你在 groovy 中运行这段代码,你得到的不是 1,2,3,4,5,6,7,8,9,而是 9,9,9,9,9,9,9, 9,9。这意味着 groovy 不会将各自的最终变量 i 绑定(bind)到每个匿名类,而只是使用执行时的最后一个设置值。

我在 groovy 文档中找不到这种行为的任何原因。顺便说一句,如果我使用 groovy 闭包而不是匿名类,我会得到相同的行为。

public static void main(String[] args) {
int[] list = new int[10];
for (int i = 0; i < 10; i++) {
list[i] = i;
}
Runnable[] runnables = new Runnable[10];
for (final int i : list) {
runnables[i] = new Runnable() {
@Override
public void run() {
System.out.println(i);
}
};
}

for (int i = 0; i < 10; i++) {
runnables[i].run();
}
}

最佳答案

奇怪...我会调查一下这是否是已知行为

同时,您可以通过在生成可运行文件的循环内声明另一个变量来解决它,然后在您的可运行文件中使用它:

for (int i : list) {
int k = i
runnables[i] = new Runnable() {
@Override
public void run() {
System.out.println(k);
}
}
}

或者通过使用 collect 生成 Runnable 数组:
Runnable[] runnables = list.collect { i -> 
new Runnable() {
@Override
public void run() {
System.out.println( i );
}
}
}

编辑

我已经四处询问,在类属性之外, final目前被 Groovy 忽略。这是将来可能添加的东西

关于groovy - groovy 是否尊重在闭包或匿名类之外定义的最终变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17466895/

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