Java のすべての引数は値渡しです。String
関数にa を渡す場合、渡される値は String オブジェクトへの参照ですが、その参照を変更することはできず、基になる String オブジェクトは不変です。
割り当て
zText += foo;
次と同等です。
zText = new String(zText + "foo");
つまり、パラメーターzText
を新しい参照として (ローカルに) 再割り当てします。これは、新しいメモリ位置を指し、その中String
には、元の内容が追加された new が含まれてい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 に似たソリューションです。Effective Javaの項目「Favor immutability」を参照してください。
ただし、前述のように、StringBuilder
パフォーマンスが向上することがよくあります。特にループ内で多くの追加を行う場合は、 を使用してStringBuilder
ください。
Strings
ただし、可能であれば、可変ではなく不変を渡すStringBuilders
ようにしてください。コードは読みやすく、保守しやすくなります。final
パラメータを作成し、メソッド パラメータを新しい値に再割り当てするときに警告するように IDE を構成することを検討してください。