Tutti gli argomenti in Java vengono passati per valore. Quando si passa String
a una funzione, il valore che viene passato è un riferimento a un oggetto String, ma non è possibile modificarlo e l'oggetto String sottostante è immutabile.
L'incarico
zText += foo;
è equivalente a:
zText = new String(zText + "foo");
Cioè, (localmente) riassegna il parametro zText
come un nuovo riferimento, che punta a una nuova posizione di memoria, in cui è un nuovoString
che contiene il contenuto originale di zText
con "foo"
allegato.
L'oggetto originale non viene modificato e la main()
variabile locale del metodo zText
punta ancora alla stringa originale (vuota).
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);
}
}
stampe:
Original value:
Local value: foo
Final value:
Se si desidera modificare la stringa, è possibile utilizzare come indicato StringBuilder
oppure un contenitore (un array o una AtomicReference
o una classe di contenitore personalizzata) che fornisce un ulteriore livello di indirizzamento del puntatore. In alternativa, è sufficiente restituire il nuovo valore e assegnarlo:
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);
}
}
stampe:
Original value:
Local value: foo
Final value: foo
Questa è probabilmente la soluzione più simile a Java nel caso generale - vedi il elemento Java efficace "Favorisci l'immutabilità".
Come notato, però, StringBuilder
spesso ti darà prestazioni migliori - se hai molto da aggiungere, in particolare all'interno di un ciclo, usa StringBuilder
.
Ma se possibile, cerca di passare da immutabile Strings
piuttosto che mutabile StringBuilders
: il tuo codice sarà più facile da leggere e più gestibile. Prendi in considerazione la possibilità di impostare i parametri final
e configurare l'IDE per avvisarti quando riassegni un parametro di metodo a un nuovo valore.