Todos os argumentos em Java são passados por valor. Quando você passa a String
para uma função, o valor passado é uma referência a um objeto String, mas você não pode modificar essa referência, e o objeto String subjacente é imutável.
A atribuição
zText += foo;
é equivalente a:
zText = new String(zText + "foo");
Ou seja, (localmente) reatribui o parâmetro zText
como uma nova referência, que aponta para um novo local de memória, no qual é um novo String
que contém o conteúdo original zText
com "foo"
anexado.
O objeto original não é modificado e a main()
variável local do método zText
ainda aponta para a string original (vazia).
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);
}
}
impressões:
Original value:
Local value: foo
Final value:
Se você deseja modificar a string, pode usar como observado, StringBuilder
ou algum contêiner (uma matriz ou uma AtomicReference
classe de contêiner personalizada) que fornece um nível adicional de indireto de ponteiro. Como alternativa, basta retornar o novo valor e atribuí-lo:
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);
}
}
impressões:
Original value:
Local value: foo
Final value: foo
Essa é provavelmente a solução mais parecida com Java no caso geral - consulte o item Java eficaz "Favor da imutabilidade".
Porém, conforme observado, StringBuilder
muitas vezes proporcionará um melhor desempenho - se você tiver muito o que fazer, especialmente dentro de um loop, use StringBuilder
.
Mas tente passar imutável, em Strings
vez de mutável, StringBuilders
se puder - seu código será mais fácil de ler e mais sustentável. Considere criar seus parâmetros final
e configurar seu IDE para avisá-lo quando você reatribuir um parâmetro de método para um novo valor.