Java Glossary : call by reference
Last updated 2004-06-28 by Roedy
Green ©1996-2004 Canadian Mind Products
Java definitions: 0-9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
You are here : home : Java
Glossary : C words : call by reference.
- call by reference
- When you call a method by reference, the callee sees the caller's original
variables passed as parameters, not copies. References to the callee's objects
are treated the same way. Thus any changes the callee makes to the caller's
variables affect the caller's original variables. Java never uses call by
reference. It always uses call by value.
How do you fake call by reference in Java, or more precisely, how can a callee
influence the values of it's caller's variables?
-
Use a holder/wrapper object passed to the callee as a parameter. The callee can
change the object's fields. That object may be as simple an Object[].
In Java a callee may change the fields of a caller's object passed as a
parameter, but not the caller's reference to that object. It can't make the
caller's variable passed as a parameter point to a different object. It can only
make its local copy point to a different object. A holder class is just a class
with fields to hold your values. It has no methods other than accessors for the
fields.
-
Have the callee return the new values, perhaps wrapped in an holder class or Object[],
and have the caller store them away somewhere.
-
Communicate via a static or instance variable visible to both caller and callee.
-
Use a delegate object. The callee calls its
methods to save the results for the caller.
Dale King points out that attempts to fake
call by reference are usually a sign of poor object-oriented design. A function
should not be trying to return more than one thing and that is what the
return value is for. He uses the term thing because it is proper to
return more than one value (e.g. returning a Point that contains two values). If
you are trying to return two values, the test he like to apply is whether you
can come up with a logical name for the values as a group. If you can't, you had
better look to see if maybe you what you have is really two functions lumped
together.