どのようにStringBufferは、クラスでのフィールドのないボイドを介してデータを渡していますか?
-
22-08-2019 - |
質問
が与えられます。クラスは何のフィールドを持っていない、すべての変数はローカルです。 littleStringは、EclipseでbigStringをリファクタリングによって作成されました。
public String bigString()
{
StringBuffer bob = new StringBuffer();
this.littleString(bob);
return bob.toString();
}
private void littleString(final StringBuffer bob)
{
bob.append("Hello, I'm Bob");
}
方法littleStringバックのStringBufferを通過すべきではない、まだあります。ブラックマジックのどのような種類がここに行きますか?これは私が知っているカプセル化のすべてのルールを破っています。私はショックだけど、言葉は私を失敗します。
解決
littleString
バックオブジェクトを渡していない - それはちょうど同じオブジェクトを使用しています。あなたがそれらのオブジェクトの1つを変更した場合、変更内容は、の他に瞬時に表示されますので、両方のbob
内のローカル変数bigString()
とbob
のパラメータlittleString()
は、同じオブジェクトを参照し、それらは同じオブジェクトへの両方の参照をしているので、の
問題がStringBuffer
sは変更可能であり、それらに関連する内部状態を持っているということです。 (例えばString
sなど)のオブジェクトの種類によっては不変であるので、あなたは安全にメソッドのパラメータとしてそれらを周りに渡すことができ、あなたは、彼らがこれまでに変更され得ることはありません知っています。 final
キーワードの追加は、ここで助けにはならないことに注意してください - それはちょうどbob
が異なるStringBuffer
オブジェクトを参照するために割り当てられていない取得しないことを確認します。
他のヒント
これは何も戻って渡していません。それはあなたがへの参照を渡されたStringBufferを修正しています。 Javaでオブジェクトは値渡しされていません。
なぜ文字列バッファは、あなたが文字列バッファオブジェクトを変更するパブリックメソッドはappendを呼び出すことができます文字列バッファへの参照を渡していたので、それはだ、修正を取得ん。
ほとんど上記の答えはそれを得た、一つの小さな事のhasnt以外言及されます。javaを使用すると、オブジェクトは変更不可能になりたいという意味、「CONSTらし」が欠けています。
「最終」に近いですが、それはまだきちんと仕事をdoesntの。どのようなコードスニペットを示したことは、あなたが他のメソッドにパラメータとして渡された変更可能なオブジェクトを持っている場合に発生することができ、エラーの一種です。これは不変オブジェクトを持つことにより、どちらか固定することができ、または深いのconstネスのために追加された新しいキーワードのいくつかの種類があります。