Усі аргументи на Java передаються за значенням. Коли ви String
передаєте функцію a, передане значення є посиланням на об'єкт String, але ви не можете змінити це посилання, і основний об'єкт String є незмінним.
Завдання
zText += foo;
еквівалентно:
zText = new String(zText + "foo");
Тобто, він (локально) переназначає параметр zText
як нове посилання, яке вказує на нове місце пам'яті, в якому є нове, String
що містить оригінальний вміст zText
з "foo"
доданим.
Оригінальний об'єкт не змінюється, а main()
локальна змінна методу zText
все ще вказує на початковий (порожній) рядок.
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);
}
}
відбитки:
Original value:
Local value: foo
Final value:
Якщо ви хочете змінити рядок, ви можете, як зазначалося, використовувати StringBuilder
або інший контейнер (масив, AtomicReference
або спеціальний клас контейнера), який дає додатковий рівень непрямості вказівника. Крім того, просто поверніть нове значення та призначте його:
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);
}
}
відбитки:
Original value:
Local value: foo
Final value: foo
Це, мабуть, найбільш схоже на Java рішення у загальному випадку - див. Ефективний пункт Java "Корисність незмінності".
Як зазначалося, однак, StringBuilder
часто ви будете мати кращі показники - якщо у вас є багато додатків, особливо це стосується циклу, використовуйте StringBuilder
.
Але намагайтеся обходити незмінний, Strings
а не змінний, StringBuilders
якщо зможете - ваш код буде простішим для читання та більш ретельним. Поміркуйте над створенням параметрів final
та налаштуванням IDE, щоб попереджати, коли параметр методу присвоює нове значення.