Semua argumen di Jawa diteruskan oleh nilai. Saat Anda melewatkan Stringfungsi, nilai yang diteruskan adalah referensi ke objek String, tetapi Anda tidak bisa mengubah referensi itu, dan objek String yang mendasarinya tidak berubah.
Tugas
zText += foo;
setara dengan:
zText = new String(zText + "foo");
Artinya, itu (secara lokal) menetapkan kembali parameter zTextsebagai referensi baru, yang menunjuk ke lokasi memori baru, di mana ini adalah yang baru Stringyang berisi konten asli zTextdengan "foo"ditambahkan.
Objek asli tidak dimodifikasi, dan main()variabel lokal metode zTextmasih menunjuk ke string asli (kosong).
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);
}
}
cetakan:
Original value:
Local value: foo
Final value:
Jika Anda ingin memodifikasi string, Anda dapat menggunakan StringBuilderatau mencatat beberapa wadah (array atau AtomicReferencekelas kontainer kustom) yang memberi Anda tingkat tipuan pointer tambahan. Atau, kembalikan nilai baru dan berikan:
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);
}
}
cetakan:
Original value:
Local value: foo
Final value: foo
Ini mungkin solusi yang paling mirip-Java dalam kasus umum - lihat item Java yang Efektif "Fungsikan ketidakmampuan."
Seperti yang disebutkan, StringBuilderakan sering memberi Anda kinerja yang lebih baik - jika Anda memiliki banyak penambahan yang harus dilakukan, khususnya di dalam satu loop, gunakan StringBuilder.
Tetapi cobalah untuk melewati kekekalan Stringsalih-alih bisa berubah StringBuildersjika Anda bisa - kode Anda akan lebih mudah dibaca dan lebih bisa dipelihara. Pertimbangkan membuat parameter Anda final, dan mengkonfigurasi IDE Anda untuk memperingatkan Anda ketika Anda menetapkan kembali parameter metode ke nilai baru.