Todos los argumentos en Java se pasan por valor. Cuando pasa un String
a una función, el valor que se pasa es una referencia a un objeto String, pero no puede modificar esa referencia, y el objeto String subyacente es inmutable.
La asignación
zText += foo;
es equivalente a:
zText = new String(zText + "foo");
Es decir, (localmente) reasigna el parámetro zText
como una nueva referencia, que apunta a una nueva ubicación de memoria, en la que hay una nueva String
que contiene el contenido original de zText
con "foo"
agregado.
El objeto original no se modifica y la main()
variable local del método zText
todavía apunta a la cadena original (vacía).
class StringFiller {
static void fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
fillString(zText);
System.out.println("Final value: " + zText);
}
}
huellas dactilares:
Original value:
Local value: foo
Final value:
Si desea modificar la cadena, puede, como se ha señalado, utilizar StringBuilder
un contenedor (una matriz o una AtomicReference
clase de contenedor personalizada) que le brinde un nivel adicional de indirección de puntero. Alternativamente, solo devuelva el nuevo valor y asígnelo:
class StringFiller2 {
static String fillString(String zText) {
zText += "foo";
System.out.println("Local value: " + zText);
return zText;
}
public static void main(String[] args) {
String zText = "";
System.out.println("Original value: " + zText);
zText = fillString(zText);
System.out.println("Final value: " + zText);
}
}
huellas dactilares:
Original value:
Local value: foo
Final value: foo
Esta es probablemente la solución más similar a Java en el caso general: consulte el elemento de Java efectivo "Favorecer la inmutabilidad".
Sin embargo, como se señaló anteriormente, StringBuilder
a menudo le brindará un mejor rendimiento, si tiene que agregar mucho, particularmente dentro de un ciclo, use StringBuilder
.
Pero intente pasar inmutable en Strings
lugar de mutable StringBuilders
si puede: su código será más fácil de leer y más fácil de mantener. Considere hacer sus parámetros final
y configurar su IDE para que le avise cuando reasigne un parámetro de método a un nuevo valor.