Re: pass by reference
Stefan Ram <ram@zedat.fu-berlin.de> quoted James Gosling:
In programming language design, the term pass by reference
properly means that when an argument is passed to a
function, the invoked function gets a reference to the
original value, not a copy of its value.
Compilers are bright. They accept lvalues for rvalues, and
know how to retrieve the (rvalue-shaped) content from the lvalue:
int i=42, j= i +1; i=43;
in "i+1" it sees, that it uses the address only to obtain the
value, whereas in "i=43", it needs to do something completely
different with "i". (iload vs. istore or getfield vs. putfield)
People (those who follow the discussed model) are just as adaptive:
They know, when they have the variable in mind (as an lvalue),
and when they intend to identify the object with the reference.
(for the time until re-assignment of the reference)
With the mental model "Only objects are passed by ref", it's
clear, that since the variable is not an object, it will not
be "passed by ref" and changes to the variable in the callee
will not reflect back. At the same time, focussing on the
objects and treating the variables as readonly (after the
object is first assigned to them) gives exactly the effect
expected from "call by ref" - of course only on the objects.
The disadvantage of this model is, that it is incompatible
with language-police-type defenders of "the one and only
standard java-model".
The advantage is, that thinking of passing Objects (which the
other model says is impossible) saves up those all too sparse
"indirection-stack-levels" in human brain.
Anyway, I shall never again say, that "java did call by ref for
objects", but more like this: "one could see it as passing
objects by ref, as long as one avoids reference-assignments
inside the callee".
PS:
The object-oriented, rather than variable-oriented, "swap":
interface Assignable {
public Assignable createCopy();
public void assignFrom(Assignable src);
}
....
void swap(Assignable a, Assignable b) {
Assignable tmp=a.createCopy();
a.assignFrom(b); b.assignFrom(tmp);
}
....