Groovy中的“each”和“eachWithIndex”闭包是否会产生深拷贝或浅拷贝?

时间:2015-12-02 22:10:12

标签: groovy

我的情况是我有一堂课Foo:

class Foo {
List<Bar> barList;
//other stuff
}

然后我想做:

void process (Foo obj){
obj.getBarList().each {
Bar bar ->
bar = doSomeStuff(bar)
}
}

这会更新对象foo中的barList属性吗?或者我必须做以下事情:

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

1 个答案:

答案 0 :(得分:1)

对于您的第一个代码示例:

assert not Station.objects.all().exist()

Foo obj中的列表栏未被修改,这意味着列表中的引用仍然相同。当doSomeStuff(bar)修改bar对象时,引用的对象会被修改,但是无法从代码中判断出来。

作业void process (Foo obj) { obj.getBarList().each { Bar bar -> bar = doSomeStuff(bar) } } 不会更改列表中的引用,因为条形码按值传递(参见Is Java pass by reference or pass by value?)。

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

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

bar = doSomeStuff(bar)

更容易看到正在发生的事情,并且更容易发生错误恕我直言。