Tous les arguments en Java sont passés par valeur. Lorsque vous transmettez un String
à une fonction, la valeur transmise est une référence à un objet String, mais vous ne pouvez pas modifier cette référence et l'objet String sous-jacent est immuable.
La tâche
zText += foo;
est équivalent à:
zText = new String(zText + "foo");
Autrement dit, il réaffecte (localement) le paramètre en zText
tant que nouvelle référence, qui pointe vers un nouvel emplacement mémoire, dans lequel se trouve un nouveau String
qui contient le contenu d'origine de zText
avec "foo"
appended.
L'objet d'origine n'est pas modifié et la main()
variable locale de la méthode zText
pointe toujours vers la chaîne d'origine (vide).
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);
}
}
imprime:
Original value:
Local value: foo
Final value:
Si vous souhaitez modifier la chaîne, vous pouvez, comme indiqué, utiliser StringBuilder
ou bien un conteneur (un tableau ou une AtomicReference
classe de conteneur ou une classe de conteneur personnalisée) qui vous donne un niveau supplémentaire d'indirection de pointeur. Sinon, renvoyez simplement la nouvelle valeur et attribuez-la:
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);
}
}
imprime:
Original value:
Local value: foo
Final value: foo
C'est probablement la solution la plus semblable à Java dans le cas général - voir l' élément Java efficace «Favoriser l'immuabilité».
Comme indiqué, cependant, StringBuilder
vous donnera souvent de meilleures performances - si vous avez beaucoup d'ajout à faire, en particulier dans une boucle, utilisez StringBuilder
.
Mais essayez de transmettre immuable Strings
plutôt que mutable StringBuilders
si vous le pouvez - votre code sera plus facile à lire et plus maintenable. Pensez à créer vos paramètres final
et à configurer votre IDE pour vous avertir lorsque vous réaffectez un paramètre de méthode à une nouvelle valeur.