There is just a detail that we have to keep in mind: wrappers are immutable. This does not mean that we can't apply, for instance, the operator ++ to an Integer, just that it won't increase the existing object value, but create a new Integer with the increased value.
This fact has an interesting consequence in conjunction to the rule that Java passes parameters to function by value.
We know that if I have such a method:
private void increase(int aValue) { System.out.println("Value increased to " + ++aValue); }This increase() method works on a copy of the passed value so we won't have any side effect on the caller:
int seven = 7; increase(seven); System.out.println("Seven is still " + seven);If we want to have a side effect, we should play with the fact that when we pass in Java an object to a method we actually pass a copy of the pointer to the object, and not of the complete object itself.
So, to simulate a passing by reference in Java, we should wrap our value in an object. A first way of doing that could be putting our primitive value in an array:
private void increase(int arr[]) { System.out.println("Value increased to " + ++arr[0]); } void f() { // ... int[] arr = new int[1]; arr[0] = 7; increase(arr); System.out.println("It was seven, now it is " + arr[0]); // ... }Alternatively, we could think about creating a wrapper class:
class Wrapper { int value; public Wrapper(int value) { this.value = value; } }Rewriting the increase() method:
private void increase(Wrapper w) { System.out.println("Value increased to " + ++w.value); }We could write the call code:
Wrapper w = new Wrapper(7); increase(w); System.out.println("It was seven, now it is " + w.value);You could think that makes no sense using a custom wrapper when we have the standard ones. But here is the caveat: Integer is immutable, we can't actually change the wrapped value. If we try to use a method like this one:
private void increase(Integer i) { System.out.println("Value increased to " + ++i); // no, no, no! }We won't get what we could have expected:
// wrapper types are immutable! Integer i = new Integer(7); increase(i); System.out.println("The value is still " + i);A better solution than creating our own wrapper is using the lang.mutable.* classes provided by the Apache Commons Lang library.
This comment has been removed by the author.
ReplyDeleteThank you, Anish.
Delete