我的情况是我有一堂课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)
}
}
答案 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)
更容易看到正在发生的事情,并且更容易发生错误恕我直言。