Wszystkie argumenty w Javie są przekazywane według wartości. Gdy przekazujesz a String
do funkcji, przekazana wartość jest odwołaniem do obiektu String, ale nie możesz zmodyfikować tego odwołania, a bazowy obiekt String jest niezmienny.
Przydzial
zText += foo;
jest równa:
zText = new String(zText + "foo");
Oznacza to, że (lokalnie) ponownie przypisuje parametr zText
jako nowe odniesienie, które wskazuje na nowe miejsce w pamięci, w którym jest nowe, String
które zawiera oryginalną zawartość zText
z "foo"
dołączoną.
Oryginalny obiekt nie jest modyfikowany, a main()
zmienna lokalna metody zText
nadal wskazuje na oryginalny (pusty) ciąg.
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);
}
}
wydruki:
Original value:
Local value: foo
Final value:
Jeśli chcesz zmodyfikować ciąg, możesz, zgodnie z opisem, StringBuilder
lub jakiś kontener (tablicę lub AtomicReference
niestandardową klasę kontenera), który zapewnia dodatkowy poziom niezależności wskaźnika. Alternatywnie, po prostu zwróć nową wartość i przypisz ją:
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);
}
}
wydruki:
Original value:
Local value: foo
Final value: foo
Jest to prawdopodobnie najbardziej podobne do Javy rozwiązanie w ogólnym przypadku - zobacz Efektywny element Java „Korzystna niezmienność”.
Jak już wspomniano, StringBuilder
często zapewnia lepszą wydajność - jeśli masz dużo do zrobienia, szczególnie wewnątrz pętli, użyj StringBuilder
.
Ale spróbuj przekazać niezmienne, Strings
a nie zmienne, StringBuilders
jeśli możesz - Twój kod będzie łatwiejszy do odczytania i łatwiejszy w utrzymaniu. Rozważ utworzenie parametrów final
i skonfigurowanie środowiska IDE, aby ostrzegało Cię, gdy ponownie przypisujesz parametr metody do nowej wartości.