Re: pass by reference
Donkey Hot <spam@plc.is-a-geek.com> wrote:
public void myFunc(String s) {
s = "123";
}
This won't work, though. While the String object s' is passed by reference,
the _reference_ s is passed by value. Any changes made to the reference in
the subprogram -- such as changing the object it points to -- will not have
any effect on the main program.
public class Demo {
private static final STRING_1 = "String_1";
private static final STRING_2 = "String_2";
public void outer( ) {
String workString = STRING_1;
change( workString );
// workString is still pointing to STRING_1
}
public void change( String stringToChange ) {
stringToChange = STRING_2;
}
}
If the argument is a mutable type (unlike String), you can get the required
effect by modifying (rather than reassigning) the object:
public class Demo2 {
private static final STRING_1 = "String_1";
private static final STRING_2 = "String_2";
public void outer( ) {
StringBuffer workString = new StringBuffer( STRING_1 );
change1( workString );
// workString now equals "String_2"
change2( workString );
// workString _still_ equals "String_2"
}
public void change1( StringBuffer stringToChange ) {
stringToChange.delete( 0, stringToChange.length( ) );
stringToChange.append( STRING_2 );
}
public void change2( StringBuffer stringToChange ) {
// This won't work, as the change to the reference is
// lost when the method returns
stringToChange = new StringBuffer( STRING_1 );
}
} // end class
If you have an immutable type or need to create a whole new object for some
other reason, you'll need to use some kind of wrapper. Either a
data-structure or an array:
public void change( String[] stringWrapper ) {
stringWrapper[0] = STRING_2;
}
private static final class ChangeData {
public String toBeChanged;
}
public void change( ChangeData data ) {
data.toBeChanged = STRING_2;
}
--
Leif Roar Moldskred
Got Sfik?