Semua argumen di Jawa diteruskan oleh nilai. Saat Anda melewatkan String
fungsi, 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 zText
sebagai referensi baru, yang menunjuk ke lokasi memori baru, di mana ini adalah yang baru String
yang berisi konten asli zText
dengan "foo"
ditambahkan.
Objek asli tidak dimodifikasi, dan main()
variabel lokal metode zText
masih 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 StringBuilder
atau mencatat beberapa wadah (array atau AtomicReference
kelas 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, StringBuilder
akan 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 Strings
alih-alih bisa berubah StringBuilders
jika 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.