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 zTexttant que nouvelle référence, qui pointe vers un nouvel emplacement mémoire, dans lequel se trouve un nouveau Stringqui contient le contenu d'origine de zTextavec "foo"appended.
L'objet d'origine n'est pas modifié et la main()variable locale de la méthode zTextpointe 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 StringBuilderou bien un conteneur (un tableau ou une AtomicReferenceclasse 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, StringBuildervous donnera souvent de meilleures performances - si vous avez beaucoup d'ajout à faire, en particulier dans une boucle, utilisez StringBuilder.
Mais essayez de transmettre immuable Stringsplutôt que mutable StringBuilderssi vous le pouvez - votre code sera plus facile à lire et plus maintenable. Pensez à créer vos paramètres finalet à configurer votre IDE pour vous avertir lorsque vous réaffectez un paramètre de méthode à une nouvelle valeur.