做",;每一个;及;“每一项指标”;Groovy中的闭包生成深拷贝还是浅拷贝?

做",;每一个;及;“每一项指标”;Groovy中的闭包生成深拷贝还是浅拷贝?,groovy,Groovy,我的情况是我有一门课: class Foo { List<Bar> barList; //other stuff } 这会更新对象foo中的barList属性吗?或者我必须做一些类似的事情: void process (Foo obj){ obj.getBarList().eachWithIndex { Bar bar -> bar = doSomeStuff(bar) obj.getBarList().set(bar, index) } } 对于第一个代码示例: void

我的情况是我有一门课:

class Foo {
List<Bar> barList;
//other stuff
}
这会更新对象foo中的barList属性吗?或者我必须做一些类似的事情:

void process (Foo obj){
obj.getBarList().eachWithIndex {
Bar bar ->
bar = doSomeStuff(bar)
obj.getBarList().set(bar, index)
}
}

对于第一个代码示例:

void process (Foo obj) {
    obj.getBarList().each {
        Bar bar -> bar = doSomeStuff(bar) }
}
Foo obj中的列表栏没有修改,这意味着列表中的引用仍然相同。当doSomeStuff(bar)修改bar对象时,引用的对象将被修改,但无法从代码中辨别

赋值
bar=dosometuff(bar)
不会更改列表中的引用,因为bar是按值传递的(请参阅)

第二个代码示例将更改列表中的引用对象

我建议您保持Bar对象不变,并使用collect操作创建一个全新的列表:

void process (Foo obj) {
    obj.bar = obj.bar.collect { doSomeStuff(it) }
}

它更容易看到正在发生的事情,并且不容易出错。

它根本不生成副本;它提供对列表中每个项目的引用。如果
doSomeStuff
对该引用进行操作,则列表将被修改到位。这是否是一个好的实践是一个单独的讨论(这很可怕,因为你现在必须理解两段代码才能解释发生了什么)。
void process (Foo obj) {
    obj.bar = obj.bar.collect { doSomeStuff(it) }
}