Todos los argumentos en Java se pasan por valor. Cuando pasa un Stringa 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 zTextcomo una nueva referencia, que apunta a una nueva ubicación de memoria, en la que hay una nueva Stringque contiene el contenido original de zTextcon "foo"agregado.
El objeto original no se modifica y la main()variable local del método zTexttodaví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 StringBuilderun contenedor (una matriz o una AtomicReferenceclase 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, StringBuildera menudo le brindará un mejor rendimiento, si tiene que agregar mucho, particularmente dentro de un ciclo, use StringBuilder.
Pero intente pasar inmutable en Stringslugar de mutable StringBuilderssi puede: su código será más fácil de leer y más fácil de mantener. Considere hacer sus parámetros finaly configurar su IDE para que le avise cuando reasigne un parámetro de método a un nuevo valor.