Java is pass by value. What if I need a pass by reference. For example in the following code I need a pass by reference mechanism.
public class BinaryTree {
public TreeNode root;
public BinaryTree(){
root = null;
}
public TreeNode insert(TreeNode temp,int x){
if(temp == null){
temp = new TreeNode();
temp.key = x;
temp.left = temp.right = null;
return temp;
}
if(temp.key > x)
temp.left = insert(temp.left,x);
else if(temp.key < x)
temp.right = insert(temp.right,x);
return null;
}
}
When insert is called with root, I need root to be passed as a reference so as to change its value. But this does not happen in Java, since it’s pass by value. In C/C++ the above could be easily achieved. Don’t you think that this is a drawback of Java? How could such problems be solved in Java?
No. Because:
(OK … so really these are counter-arguments. But we are talking about a language design issue here, and any rational discussion of language designs has to weigh up the pros and cons of supporting a particular feature. And that includes implementation cost and performance issues.)
The general approach is to restructure your code so that the variable you need to update in the called method is replaced with a reference to a mutable object or an array. This may entail the caller doing a bit more work, but that is generally acceptable.
Alternatively (and in your example) restructure the code so that call by reference is unnecessary.
In your example, there are two observations to make:
The “call-by-reference” mechanism is only used in the case where the tree is empty. It is not difficult to change this so that it is not necessary.
In fact, your use of call-by-reference, and in fact the entire
insertmethod, is a leaky abstraction. There is nothing to stop you calling the method with anodeobject that is nothing to do with the current BinaryTree instance. You are relying on the caller to maintain the (implied) invariants of the tree.The following version addresses both of these issues:
(I don’t exactly like the way that we reassign the left / right pointers at each level after the insertion, but it does make the insertion logic simple.)