Усі аргументи на 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, щоб попереджати, коли параметр методу присвоює нове значення.