Pointers in Groovy
Our example demonstrates how references work in Groovy. We’ll show this with two functions: zeroval and zeroref.
def zeroval(val) {
val = 0
}
def zeroref(ref) {
ref.value = 0
}
def main() {
def i = 1
println "initial: $i"
zeroval(i)
println "zeroval: $i"
def wrapper = [value: i]
zeroref(wrapper)
i = wrapper.value
println "zeroref: $i"
println "reference: ${wrapper.toString()}"
}
main()zeroval has a parameter that’s passed by value. zeroval will get a copy of val distinct from the one in the calling function.
zeroref, in contrast, takes an object reference. Modifying the value property of this object affects the original object.
The & syntax for getting memory addresses doesn’t exist in Groovy, so we use a wrapper object to simulate reference behavior.
def main() {
def i = 1
println "initial: $i"We first print the initial value of i.
zeroval(i)
println "zeroval: $i"zeroval doesn’t change the i in main, because it only has a copy of the value.
def wrapper = [value: i]
zeroref(wrapper)
i = wrapper.value
println "zeroref: $i"zeroref does change the value because it has a reference to the wrapper object containing i.
println "reference: ${wrapper.toString()}"We can print the string representation of the wrapper object.
When we run the program, we see that zeroval doesn’t change the original variable, but zeroref does:
$ groovy pointers.groovy
initial: 1
zeroval: 1
zeroref: 0
reference: [value:0]This example shows how Groovy handles value passing and object references, which is similar to how many other object-oriented languages work.