做",;每一个;及;“每一项指标”;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) }
}