Java'daki tüm argümanlar değere göre iletilir. Bir Stringişleve bir ilettiğinizde , iletilen değer bir String nesnesine başvuru olur, ancak bu başvuruyu değiştiremezsiniz ve temeldeki String nesnesi değiştirilemez.
Görev
zText += foo;
şuna eşittir:
zText = new String(zText + "foo");
Yani, (yerel olarak) parametreyi zTextyeni bir referans olarak yeniden atar , bu yeni bir bellek konumuna işaret eder, burada ekli ile Stringorijinal içeriğini içeren yeni bir bellektir .zText"foo"
Orijinal nesne değiştirilmez ve main()yöntemin yerel değişkeni zTextyine de orijinal (boş) dizeyi gösterir.
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);
}
}
baskılar:
Original value:
Local value: foo
Final value:
StringBuilderDizeyi değiştirmek istiyorsanız, belirtildiği gibi veya AtomicReferenceişaretçi dolaylaması ek düzeyi veren bir kap (dizi veya bir veya özel kap sınıfı) kullanabilirsiniz. Alternatif olarak, yeni değeri döndürüp atamanız yeterlidir:
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);
}
}
baskılar:
Original value:
Local value: foo
Final value: foo
Bu muhtemelen genel durumdaki en Java benzeri çözümdür - Etkili Java öğesi "Değişmezliği destekle" konusuna bakın .
Belirtildiği gibi, StringBuildergenellikle size daha iyi performans verecektir - özellikle bir döngü içinde yapacak çok fazla ekiniz varsa kullanın StringBuilder.
Ancak, mümkünse değişmez Stringsyerine geçmeye çalışın StringBuilders- kodunuzun okunması daha kolay ve daha sürdürülebilir. Parametrelerinizi oluşturmayı finalve IDE'nizi, bir yöntem parametresini yeni bir değere yeniden atadığınızda sizi uyaracak şekilde yapılandırmayı düşünün .