Javaのすべての引数は値で渡されます。あなたが渡すとString
関数に、渡された値がある 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を構成することを検討してください。